Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

281
Vistas
¿Por qué el operador ternario no admite bloques?

¿Por qué el operador ternario no tiene bloques? En otras palabras, ¿por qué el siguiente código no funciona y reporta un error para {} llaves?

 int main() { int i = 1; (i==1)?{printf("Hello\n")}:{printf("World\n")}; return 0; }

EDITAR

Quizá se malinterprete la pregunta. Era: ¿por qué no se admiten los bloques? ¿Por qué solo una sola expresión?

¿Por qué no se permite que esto funcione?

 int main() { int i = 1; (i==1)?{printf("Hello\n");printf("World\n");}:{printf("Bye\n");printf("World\n");}; return 0; }

Una razón podría ser que los ternarios a menudo se usan para la asignación condicional en el lado izquierdo y los bloques no tendrán tales retornos o se confundirán con múltiples declaraciones dentro del bloque.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Para citar el estándar C11 , capítulo §6.5.15, la sintaxis del operador condicional es

 conditional-expression: logical-OR-expression logical-OR-expression ? expression : conditional-expression

Donde, los operandos segundo y tercero son expression , no declaraciones.

Solo para elaborar,

Uno de los siguientes se cumplirá para el segundo y tercer operandos:
— ambos operandos tienen tipo aritmético;
— ambos operandos tienen la misma estructura o tipo de unión;
— ambos operandos tienen tipo void;
— ambos operandos son punteros a versiones cualificadas o no cualificadas de tipos compatibles;
— un operando es un puntero y el otro es una constante de puntero nulo; o
— un operando es un puntero a un tipo de objeto y el otro es un puntero a una versión cualificada o no cualificada de void.


Editar:

Para responder a la pregunta

¿Por qué solo una sola expresión?

de nuevo, citando la norma,

....el resultado es el valor del segundo o tercer operando (el que se evalúe), convertido al tipo descrito a continuación.

Bloque de declaraciones, no dará un valor . La evaluación de una expression puede.

over 4 years ago · Santiago Trujillo Denunciar

0

El operador ternario consta de expresiones. No existe tal tipo de expresión que use llaves.

Puedes escribir simplemente

 ( i == 1 ) ? printf("Hello\n") : printf("World\n");

Parece que el único caso en que las llaves pueden estar presentes en una expresión es el uso de un literal compuesto. Por ejemplo

 struct A { int x; int y; } a = { 1, 2 }; a = ax < ay ? ( struct A ){ ay, ax } : ( struct A ){ ++ax, --ay };

En cuanto a esta declaración

 (i==1)?{printf("Hello\n");printf("World\n");}:{printf("Bye\n");printf("World\n");};

entonces se puede reescribir de la siguiente manera usando el operador de coma

 i == 1 ? ( printf("Hello\n"), printf("World\n") ) : ( printf("Bye\n"), printf("World\n") );

O incluso como

 i == 1 ? printf("Hello\n"), printf("World\n") : ( printf("Bye\n"), printf("World\n") );

Respondiendo brevemente a su pregunta si necesita un bloque de código, use la declaración if-else en lugar del operador ternario. Aunque la declaración if-else no se puede usar en expresiones. Por otro lado, es deseable para la legibilidad del código que las expresiones no sean demasiado complejas.

Como cualquier operador, el operador ternario se usa en expresiones y devuelve algún valor evaluado. Por ejemplo, como expresión, se puede usar como inicializador o en asignaciones.

over 4 years ago · Santiago Trujillo Denunciar

0

El operador ternario espera una expresión para cada parte, y {...} no es una expresión, sino una declaración.

Para ampliar su edición, el resultado de un operador ternario es una expresión (pero no un valor l como sugiere), y los bloques de declaraciones no pueden evaluarse como un valor.

Por ejemplo, esto no tiene sentido:

 int x = (i==1)?{printf("Hello\n");printf("World\n");}:{printf("Bye\n");printf("World\n");};

Pero podrías hacer esto:

 int x = (i==1)?(printf("Hello\n"), printf("World\n")):(printf("Bye\n"), printf("World\n"));

En cuyo caso, el operador de coma haría que se devolviera el último valor de cada subexpresión.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda