Undefinierte Ausgabe von cout << a << a
Im Codeausschnitt:
int a = 0; cout << a++ << a;
wird allgemein angenommen, dass das Verhalten äquivalent ist zu:
cout << (a++) << a;
Allerdings aufgrund des Mangels Aufgrund der Anzahl von Sequenzpunkten zwischen Funktionsargumentauswertungen ist die Ausführungsreihenfolge nicht garantiert. Der Compiler kann ein Vorher oder Nachher std::operator<<<>(std::cout, a ) auswerten.
Daher lautet die korrekte Interpretation:
cout << ((a++) << a);
Das bedeutet, dass das Ergebnis undefiniert ist, da der Wert von a nach dem Inkrement im zweiten Aufruf von verwendet wird Operator<<<>.
C 17 Amendment
In C 17 wurden die Regeln wie folgt geändert:
E1 << E2
wird bewertet als:
std::operator<<<>(std::operator<<<>(E1, E2), E3)
wobei alle Nebenwirkungen von E1 vor denen von E2 sequenziert werden. Dadurch wird sichergestellt, dass das Codefragment nun die erwartete Ausgabe von „01“ erzeugt.
Das obige ist der detaillierte Inhalt vonWarum ist die Ausgabe von „cout. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!