Ich lerne gerade C ++ mit dem Buch C ++ Primer und eine der Übungen im Buch ist:
Erklären Sie, was der folgende Ausdruck bewirkt:
someValue ? ++x, ++y : --x, --y
Was wissen wir? Wir wissen, dass der ternäre Operator eine höhere Priorität hat als der Kommaoperator. Mit binären Operatoren war das ziemlich leicht zu verstehen, aber mit dem ternären Operator habe ich ein bisschen Probleme. Bei binären Operatoren bedeutet "höhere Priorität", dass wir Klammern um den Ausdruck mit höherer Priorität verwenden können und die Ausführung nicht geändert wird.
Für den ternären Operator würde ich tun:
(someValue ? ++x, ++y : --x, --y)
Dies führt effektiv zu demselben Code, der mir nicht hilft zu verstehen, wie der Compiler den Code gruppiert.
Durch das Testen mit einem C ++ - Compiler weiß ich jedoch, dass der Ausdruck kompiliert wird und ich weiß nicht, wofür ein :
Operator für sich stehen könnte. Der Compiler scheint den ternären Operator also richtig zu interpretieren.
Dann habe ich das Programm auf zwei Arten ausgeführt:
#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;
}
Ergebnisse in:
11 10
Während auf der anderen Seite someValue = false
damit druckt:
9 9
Warum sollte der C ++ - Compiler Code generieren, der für den wahren Zweig des ternären Operators nur inkrementiert x
, während er für den falschen Zweig des ternären Operators sowohl x
als auch dekrementiert y
?
Ich ging sogar so weit, den wahren Zweig wie folgt in Klammern zu setzen:
someValue ? (++x, ++y) : --x, --y;
aber es ergibt sich immer noch 11 10
.
?
ist der bedingte Operator . Der Begriff ternärer Operator bedeutet einfach einen Operator mit drei Operanden. Der bedingte Operator ist ein Beispiel für einen ternären Operator, aber eine Sprache könnte (theoretisch) mehrere ternäre Operatoren haben.