Atualmente, estou aprendendo C ++ com o livro C ++ Primer e um dos exercícios do livro é:
Explique o que a seguinte expressão faz:
someValue ? ++x, ++y : --x, --y
O que nós sabemos? Sabemos que o operador ternário tem uma precedência mais alta que o operador de vírgula. Com operadores binários, isso era muito fácil de entender, mas com o operador ternário eu estou lutando um pouco. Com operadores binários "ter maior precedência" significa que podemos usar parênteses em torno da expressão com maior precedência e isso não mudará a execução.
Para o operador ternário, eu faria:
(someValue ? ++x, ++y : --x, --y)
resultando efetivamente no mesmo código que não me ajuda a entender como o compilador agrupará o código.
No entanto, ao testar com um compilador C ++, sei que a expressão é compilada e não sei o que um :
operador pode representar por si só. Portanto, o compilador parece interpretar o operador ternário corretamente.
Então eu executei o programa de duas maneiras:
#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;
}
Resulta em:
11 10
Enquanto, por outro lado someValue = false
, imprime:
9 9
Por que o compilador C ++ geraria código que apenas para o ramo verdadeiro do operador ternário é incrementado x
, enquanto para o ramo falso do ternário ele diminui tanto x
e y
?
Até cheguei a colocar parênteses em torno do ramo verdadeiro assim:
someValue ? (++x, ++y) : --x, --y;
mas ainda resulta em 11 10
.
?
é o operador condicional . O termo operador ternário significa simplesmente um operador com três operandos. O operador condicional é um exemplo de operador ternário, mas uma linguagem pode (teoricamente) ter vários operadores ternários.