Inkrement-Operator



  • Hallo!

    ich habe eine Frage zum Inkrement-Operator.

    Wenn man folgendes Programm hat:

    int main()
    {
    	int a=2;
    
    	++a = a++;
    
    	cout << a << endl;
    
    	return 0;
    }
    

    Da wird am Ende 4 ausgegeben und das verwirrt mich ein bisschen.

    Am Anfang ist a=2, ok.

    Dann bei der Zuweisung ist es doch so, dass zuerst die rechte Seite ausgewertet wird. Auf der rechten Seite wird a inkrementiert, allerdings mit dem Postfix-Operator => auf der rechten Seite wird eine 2 zurückgegeben und danach wird a inkrementiert auf 3.

    Danach wird doch die linke Seite ausgewertet. Links wird a auf 4 inkrementiert. Und zum Schluss wird doch erst die Zuweisung durchgeführt. Die Zuweisung hat doch die geringste Priorität, also müsste der Variablen a doch wieder eine 2 zugewiesen werden ?

    Kann mir jemand bei dieser Fragestellung auf die Sprünge helfen ?

    Lieben Gruß und Danke im Voraus



  • Also bei mir kommt wirklich 3 heraus!
    das was ich mir auch dachte!
    Welche IDE nimmst du?

    mfg Patrik



  • Ich kenne zwar die genauen Regeln nicht, aber das sieht mir stark nach undefiniertem Verhalten aus.



  • Hallo Patrik,

    meine IDE ist Microsoft Visual Studio 2008 Express



  • Ich bekomme bei MSVS 2010 Ultimate auch 4.

    Es koennte gut sein, dass das Verhlaten nicht definiert ist. Ein Wunder, dass dem Compiler ob diesem Code nicht schlecht wurde.

    Ich hoffe jetzt mal, dass du die Frage rein aus Interesse gestellt hast und nicht weil du vorhast so ein Geschwuer jemals in wirklichem Code zu verwenden 😉



  • Hallo 314159265358979,

    heißt das, dass das Compiler-Abhängig ist, was passiert ?

    Danke im Voraus und Liebe Grüße



  • Das sieht mir Wirklich nach undefiniertem Verhalten aus!
    Visual C++ sagt, dass a 4 ist, code::blocks und bloodshare devC++ 3!

    Trotzdem komisch... denn die Reihenfolge der Ausführung sollte ja gleich sein!

    mfg Patrik



  • $ g++ main.cpp -o main -Wall
    main.cpp: In Funktion »int main()«:
    main.cpp:8:14: Warnung: Operation auf »a« könnte undefiniert sein [-Wsequence-point]
    

    Undefiniert heißt undefiniert. Nicht "bei VS so, bei GCC so".



  • Zagatho_zero87 schrieb:

    Das sieht mir Wirklich nach undefiniertem Verhalten aus!
    Visual C++ sagt, dass a 4 ist, code::blocks und bloodshare devC++ 3!

    Trotzdem komisch... denn die Reihenfolge der Ausführung sollte ja gleich sein!

    mfg Patrik

    Wieso sollte sie das?
    Ist eben undefiniertes Verhalten! Und der gcc machts anders als der MSVC.



  • Ethon schrieb:

    Wieso sollte sie das?
    Ist eben undefiniertes Verhalten! Und der gcc machts anders als der MSVC.

    Ja schon klar! undefiniertes Verhalten ist undefiniertes Verhalten!
    Aber für sowas gibts die Prioritätsauswertung!

    mfg Patrik


  • Mod

    Nein, eben nicht. Verstehst du überhaupt, was undefiniertes Verhalten bedeutet und wieso dieser Code undefiniert ist?



  • SeppJ schrieb:

    Nein, eben nicht. Verstehst du überhaupt, was undefiniertes Verhalten bedeutet und wieso dieser Code undefiniert ist?

    undefiniertes Verhalten bedeutet, dass man nicht weiß, wie sich der Compiler verhaltet und was am Ende heraus kommt!

    Nein weiß ich nicht, aber mochts gern wissen als bereicherung! 😃

    mfg
    Patrik



  • Zagatho_zero87 schrieb:

    Ja schon klar! undefiniertes Verhalten ist undefiniertes Verhalten!
    Aber für sowas gibts die Prioritätsauswertung!

    Ich glaube, du hast da etwas falsch verstanden. Die Auswertungsreihenfolge der Operanden hat überhaupt gar nichts mit der Priorität zu tun, sondern ist undefiniert. Die Priorität besagt nur, welche Operanden ein Operator an sich bindet; nicht mehr und nicht weniger. Im Endeffekt bedeutet das sozusagen, dass unsichtbare Klammern gesetzt werden.

    Zagatho_zero87 schrieb:

    undefiniertes Verhalten bedeutet, dass man nicht weiß, wie sich der Compiler verhaltet und was am Ende heraus kommt!

    Undefiniertes Verhalten bedeutet einfach, dass man nicht weiß, wie sich das Programm zur Laufzeit verhält. Vielleicht bekommst du z.B. einen Bluescreen.



  • Hallo

    Die Sprache legt die Reihnfolge der Auswertung nicht fest.
    Die einzigen Operatoren die eine Reinfolge angeben sind: && , || , (? : ) und der Kommaoperator.

    anneXus



  • anneXus schrieb:

    Die einzigen Operatoren die eine Reinfolge angeben sind: && , || , (? : ) und der Kommaoperator.

    😕 Das was du meinst, bezieht sich doch auf die Abarbeitungsreihenfolge des Ausdrucks, nicht aber auf die Auswertung der Operanden, oder nicht?



  • hat das hier nicht wieder was mit diesen "sequence points" zu tun? oder bin ich da jetzt auch total auf dem holzweg ?


  • Mod

    Psycho schrieb:

    hat das hier nicht wieder was mit diesen "sequence points" zu tun? oder bin ich da jetzt auch total auf dem holzweg ?

    Jain. Im Ausdruck des Threaderstellers sind eben keine, das ist ja das Problem. Zwischen den Operanden von && , || , (? : ) und dem Kommaoperator (nicht dem Komma bei Funktionsparametern!) wäre einer.


Anmelden zum Antworten