valor ternarios ternario ternaria operadores operador asignacion c operator-keyword if-statement ternary

ternarios - Operador ternario sin otra cosa en C



return operador ternario (8)

Intenté poner cualquier número entero allí y funciona bien. Por ejemplo, si desea devolver "a" si se evalúa como verdadero, puede escribirlo así:

true ? a : 1;

Quiero usar un operador ternario sin otra cosa en C. ¿Cómo lo hago?

(a)? b: nothing;

algo como esto. ¿Qué uso en nada parte?


No puedes omitir la else parte. Solo usa una expresión ninguna.

Pero, en ese caso, a menudo es mejor usar un if ...


Parece que esta pregunta ha existido por un tiempo, pero FWIW un programa corto de C compilado con GCC 4.6.3 reveló lo siguiente:

  1. Lo siguiente no compila: a = a ? b:; a = a ? b:; . "error: expresión esperada antes de '';'' simbólico".
  2. Lo siguiente es equivalente: a = a ?: b; y a = a ? a : b; a = a ? a : b;

Tal vez alguien pueda agregar más detalles del lado del compilador, pero para mí, parece que omitir la true ruta de ejecución es simplemente una fantasía.


Prueba esto

BOOL bIsOK = (a == 5)?TRUE:FALSE;


Si está utilizando un operador ternario como ese, probablemente se podría reemplazar por:

if (a) { b; }

que es mucho, mucho mejor (La intención es más clara, por lo que el código es más fácil de leer y no habrá pérdida de rendimiento).

Sin embargo, si está utilizando el operador ternario como una expresión, es decir,

printf("%d cat%s", number_of_cats, number_of_cats != 1 ? "s" : <nothing>); a = b*c + (d == 0 ? 1 : <nothing>);

entonces el valor <nothing> depende del contexto en el que se está utilizando. En mi primer ejemplo, <nothing> debería ser "" , y en el segundo debería ser 0 .


Una expresión falsa omitida no es válida. Intente revertir la condición en su lugar.

(!a) ?: b;


hice esto

isLeapYear(i) ? cout<< i<<endl: cout<<"" ;

No estoy seguro, sin embargo, si hay algún impacto de rendimiento con esto.


if-else es una construcción de flujo de control wheras ?: es un operador, y x ? y : z x ? y : z es una expresión: una expresión no puede tener "ningún valor", mientras que el flujo de control puede tener una "ruta de no hacer nada". No existe una equivalencia real entre if-else y?: - no son intercambiables en todas las circunstancias.

Puede lograr el efecto que desea en algunas circunstancias, pero probablemente sea menos eficiente que usarlo sin else . Por ejemplo el efecto de:

if( x ) { y = z ; }

se puede lograr mediante:

y = x ? z : y ;

pero hay una asignación efectiva pero redundante de lo else y = y cuando x es falso que su compilador puede o no optimizar. Por lo tanto, puede lograr el efecto pero solo si conoce el "valor actual" para devolverlo como el resultado de la expresión ?: