2010-11-19 14 views
0

Mögliche Duplizieren:
FAQ : Undefined Behavior and Sequence PointsUnpredictable Ausgang

#include<iostream> 
#include<stdio.h> 
int main(){ 
    int myVal = 0; 
    printf("%d %d %d\n", ++myVal,myVal,++myVal); 
    myVal = 0 ; /*reset*/  
    std::cout<<++myVal<<" "<<myVal<<" "<<++myVal<<std::endl; 
    return 0; 
} 

ich den Ausgang 2 2 2 in beiden Fällen bekam. Wie könnte es 2 2 2 sein? Ich erwartete 2 1 1 oder 1 1 2

+7

oh nein. nicht noch einmal. Suche nach 'Sequenzpunkt' in SO und Du bekommst Deine Antwort – Chubsdad

+6

Duplikat von [FAQ: Undefiniertes Verhalten und Sequenzpunkte] (http://stackoverflow.com/questions/4176328/faq-undefined-behavior-and-sequence-points) – Naveen

+0

@Naveen: Danke. Heutzutage mag ich es nicht, diese Sequenz 'Sequenzpunkt' zu sehen. – Chubsdad

Antwort

0

Der Vorinkrementierungsoperator ist tatsächlich kompiliert, so dass alle Aufrufe an ihn ausgeführt werden, bevor die Ausdrücke printf und cout ausgewertet werden.

Es ist nur so, als ob Sie hatte:

int myVal = 0; 
myVal += 1; 
myVal += 1; 
printf("%d %d %d\n", myVal, myVal, myVal); 

Es können auch, dass die Compiler-Optimierungen so weit gehen vorstellen konnte eine Konstante als mit ‚2‘ Wert statt in diesem Fall die Inkrementierungen zur Laufzeit durchführen.

edit: diclaimer: Diese Antwort ist ein Versuch zu erklären, was speziell im Falle des OP-Codes passiert ist, aber es ist wirklich ein Beispiel für undefiniertes Verhalten, da Compiler in dieser Situation so ziemlich alles machen können, was sie wollen.

+1

Kein Downvote, aber jede Antwort zu dieser Frage sollte wirklich die Worte "undefined Verhalten r "! –