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.
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
@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' –
@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