Komma-Operator und void-Ausdruck

8

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ßer main() ), 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.

    
Prasoon Saurav 23.03.2011, 05:01
quelle

3 Antworten

6

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.

    
Johannes Schaub - litb 24.03.2011, 19:04
quelle
3

Es ist undefiniertes Verhalten.

Die Auswertung des linken Ausdrucks führt dazu, dass das Ende einer wertrückkehrenden Funktion ohne Rückgabe abläuft. Nur weil der Wert verworfen wird, bedeutet das nicht, dass die Auswertung nie stattgefunden hat.

    
GManNickG 23.03.2011 05:05
quelle
1

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.

    
Matthew Flaschen 23.03.2011 05:08
quelle