Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

285
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda