c++ - sentencia - ¿Cómo se ejecuta esta expresión condicional ternaria?
operador ternario python (3)
int x = 5,y = 10;
bool boolean = 0;
int k = (boolean ? ++x, ++y : --x, --y);
cout<<k;
Cuando el valor booleano es 0, genera 9, sin embargo, cuando es 1, genera 10. Sé que esto está sucediendo debido a la precedencia pero no puedo entender exactamente cómo está sucediendo, por favor ayúdeme a entender esto.
NOTA: Sé que puedo obtener el resultado esperado si uso paréntesis, o mejor escribo un código limpio, solo uso esto para entender cómo el compilador evaluará expresiones como estas de acuerdo con la prioridad.
Dadas las excelentes respuestas anteriores, uno debería escribir en su lugar:
if (boolean) {
++x;
++y;
} else {
--x;
--y;
}
int k = y;
Porque entonces el código es más legible y claro en su intención. Esto ayudará a cualquier persona que tenga que mantener el código (¡incluido el autor original!) Sin que nadie tenga que perder el tiempo haciendo SO preguntas o preocupándose por la prioridad de ,
o ?:
O cuál es la logística de la asignación a una expresión tan compleja. Cualquier compilador moderno optimizará tanto esto como lo anterior al mismo código resultante
Debido a que el operador de coma tiene la prioridad de operador más baja, su declaración es en realidad igual a
k = (boolean ? (++x, ++y) : --x), --y;
Eso significa que cuando boolean
es true
, ambos aumentan y disminuyen y
. El resultado de la expresión ternaria se desecha en ambos casos y a k
solo se le asigna el resultado de --y
.
Cabe señalar que esto no es un comportamiento indefinido, ya que el operador de coma introduce un punto de secuencia.
Para obtener el resultado que espera, necesita hacer
k = boolean ? (++x, ++y) : (--x, --y);
Tenga en cuenta que los paréntesis alrededor de ++x, ++y
son estrictamente necesarios, pero hacen que la expresión sea más clara.
,
tiene menor precedencia que ?:
. Lo que significa que el paréntesis completo es:
int k = ((boolean ? (++x, ++y) : --x), --y);
Como puede ver, k
siempre se inicializa con el valor de --y
. Es solo que si boolean
es true
, ++y
sucede antes de eso.
Cuando busque la forma de paréntesis completa de una expresión, piense en ella como en la construcción del árbol de expresiones (donde el operador de prioridad más baja se encuentra en la raíz).
Encuentre el operador de prioridad más baja en una expresión y ponga paréntesis entre su argumento del lado izquierdo y su argumento del lado derecho. Repetir recursivamente dentro de las sub-expresiones solo paréntesis.