J'apprends actuellement le C ++ avec le livre C ++ Primer et l'un des exercices du livre est:
Expliquez ce que fait l'expression suivante:
someValue ? ++x, ++y : --x, --y
Que savons-nous? Nous savons que l'opérateur ternaire a une priorité plus élevée que l'opérateur virgule. Avec les opérateurs binaires, c'était assez facile à comprendre, mais avec l'opérateur ternaire, je me bats un peu. Avec les opérateurs binaires "ayant une priorité plus élevée" signifie que nous pouvons utiliser des parenthèses autour de l'expression avec une priorité plus élevée et cela ne changera pas l'exécution.
Pour l'opérateur ternaire, je ferais:
(someValue ? ++x, ++y : --x, --y)
résultant effectivement dans le même code qui ne m'aide pas à comprendre comment le compilateur regroupera le code.
Cependant, après avoir testé avec un compilateur C ++, je sais que l'expression se compile et je ne sais pas ce qu'un :
opérateur pourrait représenter par lui-même. Le compilateur semble donc interpréter correctement l'opérateur ternaire.
Ensuite, j'ai exécuté le programme de deux manières:
#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;
}
Résulte en:
11 10
Alors que d'autre part avec someValue = false
elle imprime:
9 9
Pourquoi le compilateur C ++ générerait-il du code qui pour la vraie branche de l'opérateur ternaire n'incrémente que x
, tandis que pour la fausse branche du ternaire, il décrémente à la fois x
et y
?
Je suis même allé jusqu'à mettre des parenthèses autour de la vraie branche comme ceci:
someValue ? (++x, ++y) : --x, --y;
mais il en résulte toujours 11 10
.
?
est l' opérateur conditionnel . Le terme opérateur ternaire signifie simplement un opérateur avec trois opérandes. L'opérateur conditionnel est un exemple d' opérateur ternaire, mais un langage pourrait (théoriquement) avoir plusieurs opérateurs ternaires.