Ich stieß auf dieses Code-Snippet 1
%Vor%1: Dies ist kein reales Beispiel.
Meine Frage lautet " Ist das Verhalten des Codeausschnitts in C und C ++ gut definiert? "
Mein Take:
In C ist das Verhalten gut definiert, weil 6.5.17
sagt
Der linke Operand eines Komma-Operators wird als void-Ausdruck ausgewertet; Es gibt einen Sequenzpunkt nach der Auswertung
In C ++ 03 ist das Verhalten gut definiert, weil 5.18
sagt
Ein Paar mit einem Komma getrennter Ausdrücke wird von links nach rechts ausgewertet und der Wert des linken Ausdrucks wird verworfen .
Allerdings sagt C ++ 03 (im Abschnitt 6.6.3
) auch, dass
Das Ende einer Funktion zu fließen entspricht einer Rückgabe ohne Wert; Dies führt zu undefiniertem Verhalten in einer Wert zurückgebenden Funktion.
Ähnlich in C
Wenn die Steuerung das Ende (
}
) der nicht-void-Funktion erreicht (außermain()
), ist das Verhalten nicht definiert.
Wenn ich all diese Punkte in Betracht ziehe, kann ich das tatsächliche Verhalten nicht beurteilen. Was denkst du Leute?
P.S: Wenn Sie denken, dass die Frage nutzlos ist und Sie bessere Dinge zu tun haben, helfen Sie sich selbst: D.
Die C-Spezifikation, die ich habe (C99 TC3) sagt
Wenn das}, das eine Funktion beendet, erreicht wird und der Wert des Funktionsaufrufs vom Aufrufer verwendet wird, ist das Verhalten nicht definiert.
Der Wert eines Ausdrucks, der als "ungültiger Ausdruck" bewertet wird, wird verworfen. Im C-Fall gibt es also kein undefiniertes Verhalten. Es könnte in altem C anders gewesen sein (einige Details sind, wenn ich mich richtig erinnere).
Die Situation für C ++ unterscheidet sich ein wenig von der für C, da C ++ Klassenobjekte mit Konstruktoren und Destruktoren als Rückgabewerte unterstützt und deren Verarbeitung auf nicht initialisiertem Speicher nicht garantiert werden kann. Vielleicht hat dies zu den unterschiedlichen Regeln für C ++ beigetragen.
Es ist eindeutig undefiniert. C99 §6.3.2.2 sagt, "(Ein void Ausdruck wird auf seine Nebenwirkungen bewertet.)" Also wird die Funktion ausgewertet und fließt vom Ende weg. Es gibt keine kostenlose Gefängniskarte.
Tags und Links c c++ undefined-behavior comma-operator