2010-11-01 12 views
11

sich das folgende (triviale) Code-Segment:Innerhalb einer while-Schleife wird garantiert, dass die letzte durch Komma getrennte Anweisung zuletzt ausgeführt wird?

while (i++, i <= 10) { 
    // some more code 
} 

Im allgemeinen Fall, C++ ermöglicht comma-Anweisungen getrennt in beliebiger Reihenfolge bewertet werden. Sind wir bei einer while-Schleife zumindest (durch die Angabe) garantiert, dass die letzte Anweisung (die als Bedingung für die Schleife verwendet wird) zuletzt ausgewertet wird?

+6

Ich nehme an, das ist neben Ihrem Punkt, aber nur für den Fall: Sie könnten diese Bedingung als 'i ++ <= 10' umschreiben und den Komma-Operator loswerden. Jetzt geh und sag mir, dass das neben deinem Punkt ist. ':)' – sbi

+6

@sbi - macht das das gleiche? Ich hätte das mit Präfix, aber nicht Postfix erwartet. dh. '++ i, i <= 10' ist das gleiche wie' ++ i <= 10' –

+0

@Steve: Du hast mich da hingebracht. Ja, es sollte "++ i <= 10" sein. Das tut mir leid. (Ich sollte wirklich nicht versuchen, das zu tun, während [chatten] (http://chat.stackoverflow.com/rooms/10/clounge).) – sbi

Antwort

16

Im allgemeinen Fall erlaubt C++, dass kommagetrennte Anweisungen in beliebiger Reihenfolge ausgewertet werden.

Wenn Sie auf die Kommas zwischen Funktionsargumenten verweisen, ist das nur ein Trennzeichen.

In Ihrem Fall verwenden Sie den Kommaoperator, und das führt einen Sequenzpunkt ein, der garantiert, dass alle Nebenwirkungen aus dem linken Operanden des Kommas sich beruhigt haben, bevor der richtige ausgewertet wird.

Also ja, es ist klar definiert.

Aus dem Bereich 5,18/1 der ISO C++ 98-Standard:

Ein Paar von Ausdrücken durch ein Komma getrennt ausgewertet wird von links nach rechts, und dem Wert des linken Ausdrucks verworfen. Die Standardkonvertierungen von lvalue-to-rvalue (4.1), Array-to-Pointer (4.2) und Funktion-zu-Zeiger (4.3) werden nicht auf den linken Ausdruck angewendet. Alle Nebenwirkungen (1.9) des linken Ausdrucks, mit Ausnahme der Zerstörung von Provisorien (12.2), werden vor der Auswertung des richtigen Ausdrucks durchgeführt. Der Typ und Wert des Ergebnisses sind der Typ und der Wert des rechten Operanden; Das Ergebnis ist ein Lvalue, wenn sein rechter Operand ist.

11

Ja. Der , Operator (sofern nicht überladen!) Führt einen sogenannten Sequenzpunkt ein und garantiert tatsächlich die Reihenfolge der Ausführung von links nach rechts.

+3

... und vor allem der Kontext (wie in der 'while' Bedingung) spielt keine Rolle für die obige Aussage . – dmckee

1

Die obigen Kommentare haben es erklärt. Und eines der gemeinsamen Weg, um diese Methode des Missbrauchs ist

while(scanf("%d", &n), n){ 
    // do something 
} 

Diese ganze Zahl gelesen wird, bis wir Null gelesen.

Verwandte Themen