Attualmente sto imparando C ++ con il libro C ++ Primer e uno degli esercizi nel libro è:
Spiega cosa fa la seguente espressione:
someValue ? ++x, ++y : --x, --y
Cosa sappiamo? Sappiamo che l'operatore ternario ha una precedenza maggiore dell'operatore virgola. Con gli operatori binari questo era abbastanza facile da capire, ma con l'operatore ternario sto faticando un po '. Con operatori binari "con precedenza maggiore" significa che possiamo usare parentesi attorno all'espressione con precedenza maggiore e non cambierà l'esecuzione.
Per l'operatore ternario farei:
(someValue ? ++x, ++y : --x, --y)
risultando effettivamente nello stesso codice che non mi aiuta a capire come il compilatore raggrupperà il codice.
Tuttavia, dal test con un compilatore C ++ so che l'espressione si compila e non so cosa :
possa rappresentare un operatore da solo. Quindi il compilatore sembra interpretare correttamente l'operatore ternario.
Quindi ho eseguito il programma in due modi:
#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;
}
Risultati in:
11 10
Mentre d'altra parte con someValue = false
esso stampa:
9 9
Perché il compilatore C ++ dovrebbe generare codice che per il ramo vero dell'operatore ternario incrementa solo x
, mentre per il ramo falso del ternario decrementa sia x
e y
?
Sono persino arrivato a mettere parentesi attorno al vero ramo in questo modo:
someValue ? (++x, ++y) : --x, --y;
ma risulta comunque 11 10
.
?
è l' operatore condizionale . Il termine operatore ternario significa semplicemente un operatore con tre operandi. L'operatore condizionale è un esempio di operatore ternario, ma una lingua potrebbe (teoricamente) avere più operatori ternari.