Ist 'C == C ++' undefiniertes Verhalten?

8

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?

    
Fengyang Wang 22.09.2014, 00:54
quelle

2 Antworten

13

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

enthalten
  

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 ):

%Vor%

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.

    
Shafik Yaghmour 22.09.2014, 01:04
quelle
1

Sie haben Recht. Sogar der Compiler sagt das: kompilieren

%Vor%

ergibt:

%Vor%

( Coliru )

    
Csq 22.09.2014 00:58
quelle

Tags und Links