Heim > Backend-Entwicklung > C++ > Was ist die Ausgabe von „cout

Was ist die Ausgabe von „cout

DDD
Freigeben: 2024-12-09 16:39:10
Original
902 Leute haben es durchsucht

What is the Output of

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;
Nach dem Login kopieren

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);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage