sola - ?: comportamiento de operador condicional ternario al dejar una expresión vacía
operador ternario python (2)
Estaba escribiendo una aplicación de consola que trataría de "adivinar" un número por prueba y error, funcionó bien y todo me dejó preguntándome sobre cierta parte que escribí distraídamente,
El código es:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x,i,a,cc;
for(;;){
scanf("%d",&x);
a=50;
i=100/a;
for(cc=0;;cc++)
{
if(x<a)
{
printf("%d was too big/n",a);
a=a-((100/(i<<=1))?:1);
}
else if (x>a)
{
printf("%d was too small/n",a);
a=a+((100/(i<<=1))?:1);
}
else
{
printf("%d was the right number/n-----------------%d---------------------/n",a,cc);
break;
}
}
}
return 0;
}
Más específicamente, la parte que me confundió es
a=a+((100/(i<<=1))?:1);
//Code, code
a=a-((100/(i<<=1))?:1);
Usé ((100/(i<<=1))?:1)
para asegurarme de que si 100/(i<<=1)
devolvía 0 (o falso) la expresión completa se evaluaría a 1 ((100/(i<<=1))?:***1***)
, y dejé la parte del condicional que funcionaría si fuera verdadera vacía ((100/(i<<=1))? _this space_ :1)
, parece funcionar correctamente, pero ¿hay algún riesgo al dejar vacía esa parte del condicional?
Esta es una extensión de GCC para el lenguaje C. Cuando no aparece nada entre ?:
, El valor de la comparación se usa en el caso verdadero.
El operando medio en una expresión condicional puede ser omitido. Entonces, si el primer operando es distinto de cero, su valor es el valor de la expresión condicional.
Por lo tanto, la expresión
x ? : y
tiene el valor de x si es distinto de cero; de lo contrario, el valor de y.
Este ejemplo es perfectamente equivalente a
x ? x : y
En este caso simple, la capacidad de omitir el operando medio no es especialmente útil. Cuando resulta útil es cuando el primer operando lo hace, o puede (si es un argumento macro) contener un efecto secundario. Luego repetir el operando en el medio realizaría el efecto secundario dos veces. Omitir el operando medio utiliza el valor ya calculado sin los efectos indeseables de volver a calcularlo.
Esta es una extensión C de GNU ( ¿ ves ? Entrada de wikipedia ), por lo que para la portabilidad debes indicar explícitamente el segundo operando.
En el caso "verdadero", devuelve el resultado del condicional.
Las siguientes afirmaciones son casi equivalentes:
a = x ?: y;
a = x ? x : y;
La única diferencia está en la primera afirmación, x
siempre se evalúa una vez, mientras que en la segunda, x
se evaluará dos veces si es verdadera. Entonces, la única diferencia es cuando evaluar x
tiene efectos secundarios.
De cualquier manera, consideraría que este es un uso sutil de la sintaxis ... y si tiene empatía con quienes mantienen su código, debe indicar explícitamente el operando. :)
Por otro lado, es un buen truco para un caso de uso común.