Ein Freund sagt mir das nach:
%Vor% C == C++
hat den Wert true
. Dies ist als ein Witz gedacht, eine Widerlegung der Art zu den oft behaupteten "C ist nicht das gleiche wie C ++".
Da ==
jedoch kein Sequenzpunkt ist, argumentiere ich, dass dies ein undefiniertes Verhalten ist. Das Programm kann zuerst C++
auswerten, so dass C > C++
und C == C++
beide nicht definiert sind. % Co_de% wird jedoch immer als wahr ausgewertet. Dasselbe gilt natürlich, wenn die Operanden umgedreht werden ( C >= C++
ist immer wahr und alles andere ist nicht definiert).
Stimmt diese Analyse?
Alle Fälle führen zu undefiniertem Verhalten und unvorhersehbaren Ergebnissen.
Der Entwurf des C ++ 11-Standards teilt uns dies mit dass, wenn nicht anders angegeben, die Reihenfolge der Auswertungen von Operanden nicht sequentiell ist und wenn das gleiche skalare Objekt mehr als einmal durch unselektierte Nebenwirkungen modifiziert wird, als wenn wir ein undefiniertes Verhalten haben. Es ist auch undefiniert, wenn wir das Objekt ändern müssen und den Wert des Objekts für einen anderen Operanden berechnen müssen. Dies ist im Entwurf des C ++ 11-Standardabschnitts 1.9
Sofern nicht anders angegeben, Bewertungen von Operanden einzelner Operatoren und von Unterausdrücken einzelner Ausdrücke sind nicht sequentiell. [ Hinweis: In einem Ausdruck, der während des Tests mehr als einmal ausgewertet wird Ausführung eines Programms, unsequenced und unbestimmt sequenziert Bewertungen seiner Unterausdrücke müssen nicht konsistent durchgeführt werden in verschiedenen Auswertungen. Endnote] Die Wertberechnungen des Operanden eines Operators werden vor der Wertberechnung von das Ergebnis des Betreibers. Wenn eine Nebenwirkung auf ein Skalarobjekt ist nicht sequenziert relativ zu einem anderen Nebeneffekt auf dem gleichen Skalar Objekt oder eine Wertberechnung unter Verwendung des Wertes desselben Skalars Objekt, das Verhalten ist nicht definiert.
Weder die Gleichheitsoperatoren noch die Vergleichsoperatoren in den Abschnitten 5.9
Relationale Operatoren und 5.10
Gleichheitsoperatoren geben eine Sequenz für die Operanden an.
clang
bietet auch eine Warnung für diesen Fall, es sieht wie folgt aus, sollte in etwa so aussehen: es live sehen ):
Dies ist auch undefiniertes Verhalten in C ++ 03, wobei nicht das Konzept der Sequenzbeziehungen verwendet wurde, sondern nur Sequenzpunkte . Im Entwurf des C ++ 03-Standards wäre der relevante Abschnitt Chapter 5
Ausdrücke , der lautet:
Außer wo angemerkt, die Reihenfolge der Auswertung von Operanden der einzelnen Operatoren und Teilausdrücke einzelner Ausdrücke und die Reihenfolge in denen Nebenwirkungen auftreten, ist nicht spezifiziert.57) Zwischen den Vorheriger und nächster Sequenzpunkt soll ein skalares Objekt gespeichert haben Wert höchstens einmal durch die Auswertung eines Ausdrucks modifiziert. Darüber hinaus soll auf den vorherigen Wert nur zugegriffen werden, um die Wert gespeichert werden soll. Die Anforderungen dieses Absatzes müssen erfüllt sein für jede zulässige Reihenfolge der Teilausdrücke eines vollen Ausdruck; Ansonsten ist das Verhalten nicht definiert.
, was einfacher zu verstehen ist, da eine mehrfache Modifikation oder eine Modifikation und die Verwendung des Wertes eines Skalars innerhalb des gleichen Sequenzpunktes ein undefiniertes Verhalten ist, ohne die Reihenfolge der Operationen herauszufinden.
Tags und Links c++ undefined-behavior