Das Rätsel von „cout << a << a“: Undefiniertes Verhalten entlarven
Eine rätselhafte Interviewfrage ist kürzlich aufgekommen eine Debatte: Was ist die richtige Ausgabe für die folgende Aussage?
int a = 0; cout << a++ << a;
Einige Kandidaten wählte selbstbewusst „01“, während andere argumentierten, dass das Verhalten undefiniert sei – eine Antwort, die zunächst einige überraschte.
Der Knackpunkt liegt in der Bewertungsreihenfolge und den Nebenwirkungen der Aussage. Um dies zu verstehen, erweitern wir es in sein Funktionsaufrufäquivalent:
std::operator<<(std::operator<<(std::cout, a++), a);
C garantiert, dass Nebenwirkungen vorangehender Auswertungen an Sequenzpunkten ausgeführt werden. Es gibt jedoch keine Sequenzpunkte zwischen den Argumentauswertungen, sodass die Reihenfolge der Argumentauswertung ungewiss ist – entweder a kann vor a ausgewertet werden oder umgekehrt.
Diese Mehrdeutigkeit in der Auswertungsreihenfolge macht das Verhalten der Aussage undefiniert. Im Fall von a und a wird jedoch das Ergebnis von ersterem als Argument für letzteres verwendet, sodass die Ausgabe von der Reihenfolge der Auswertung abhängt.
C 17-Update: Klarheit inmitten der Mehrdeutigkeit
In C 17 haben sich die Regeln weiterentwickelt. Es wurde eine spezielle Aussage zu Schichtoperatoren eingeführt, die besagt, dass die Auswertung und Nebenwirkungen des linken Operanden vor denen des rechten Operanden erfolgen müssen.
In a shift operator expression E1<>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2. Durch dieses Mandat wird der Ausdruck „a < a“ muss in C 17 die Ausgabe „01“ erzeugen und das zuvor undefinierte Verhalten auflösen.
Diese Verfeinerung der Semantik gewährleistet Klarheit und Konsistenz bei der Auswertung von Ausdrücken Schichtoperatoren, die sich an idiomatischen C-Praktiken orientieren.
Das obige ist der detaillierte Inhalt vonWas ist die Ausgabe von „cout. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!