Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

282
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!