Actualmente estoy aprendiendo C ++ con el libro C ++ Primer y uno de los ejercicios del libro es:
Explica qué hace la siguiente expresión:
someValue ? ++x, ++y : --x, --y
¿Qué sabemos? Sabemos que el operador ternario tiene mayor precedencia que el operador de coma. Con los operadores binarios esto fue bastante fácil de entender, pero con el operador ternario estoy luchando un poco. Con los operadores binarios "tener mayor precedencia" significa que podemos usar paréntesis alrededor de la expresión con mayor precedencia y no cambiará la ejecución.
Para el operador ternario haría:
(someValue ? ++x, ++y : --x, --y)
dando como resultado efectivamente el mismo código, lo que no me ayuda a comprender cómo el compilador agrupará el código.
Sin embargo, al probar con un compilador de C ++, sé que la expresión se compila y no sé qué :
podría representar un operador por sí mismo. Entonces, el compilador parece interpretar correctamente el operador ternario.
Luego ejecuté el programa de dos maneras:
#include <iostream>
int main()
{
bool someValue = true;
int x = 10, y = 10;
someValue ? ++x, ++y : --x, --y;
std::cout << x << " " << y << std::endl;
return 0;
}
Resultados en:
11 10
Mientras que por otro lado someValue = false
imprime:
9 9
¿Por qué el compilador de C ++ generaría código que para la rama verdadera del operador ternario solo aumenta x
, mientras que para la rama falsa del ternario disminuye tanto x
y y
?
Incluso fui tan lejos como para poner paréntesis alrededor de la rama verdadera de esta manera:
someValue ? (++x, ++y) : --x, --y;
pero todavía resulta en 11 10
.
?
es el operador condicional . El término operador ternario simplemente significa un operador con tres operandos. El operador condicional es un ejemplo de un operador ternario, pero un lenguaje podría (teóricamente) tener múltiples operadores ternarios.