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:
- Lo siguiente no compila:
a = a ? b:;
a = a ? b:;
. "error: expresión esperada antes de '';'' simbólico". - Lo siguiente es equivalente:
a = a ?: b;
ya = 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 ?: