cout - Reihenfolge der Auswertung



  • Moin,

    hab ein kleines Problem bzw stehe auffem Schlauch.

    In allen Infoquellen lese ich, dass cout von links aus zusammenfasst.

    Warum aber erzeugt dann die Anweisung (mit z.B. x = 2) cout << x << " = " << x++; die Ausgabe 3 = 2 ?

    Wenn doch von links ausgewertet wird müsste die Ausgabe doch eher 2 = 2 lauten oder im Falle von Präfix-Incr 2 = 3

    Mir ist klar dass der ++Operator ne höhere Priorität hat, aber das dürfte doch keine Rolle spielen wenn beim Shiftoperator von links her zusammengefasst wird und somit das erste x schon im ostream gelandet ist bevor es zur Auswertung von x++ kommt.

    Oder hält sich da VS2010Ultimate ned an den Standard?

    thx & cu
    pc-dau2



  • kurz: undefined behaviour.

    lang: es gibt von links nach rechts aus, aber die auswertungsreihenfolge ist nicht festgelegt



  • Hui, Blitzanwort. Oder wurde die Frage so oft gestellt dass es dafür schon nen Antwort-Bot gibt? 😉

    Also gilt die Auswertungsreihenfolge des Shiftoperators nur wenn keine zusätzlichen Anweisungen enthalten sind?

    Wurde auf das Problem bei folgender Anweisung aufmerksam:

    cout << frac1 << " += " << frac2 << " = " << frac1.operator+=(frac2) <<endl;
    

    frac1 enthält schon der Wert der +=Anweisung obwohl diese Anweisung ja erst am Schluss ausgeführt werden sollte.

    Ist dann wohl selbes Problem wie im vereinfachten Beispiel.

    Hab die Anweisung einfach in zwei Teile zerlegt und jetzt passts - ned schön, aber funzt. Man lernt halt nie aus.

    Jedenfalls nochma danke für die schnelle Antwort. Hat mir ne schlaflose Nacht erspart! 😃



  • Bis gestern habe ich auch noch gedacht, die die Priorität (Precedence) bestimmt die Auswertungsreihenfolge (order of evaluation). Das ist aber falsch. Letztendlich sagt die Priorität nur, welche Operanden ein Operator an sich bindet. Das Problem bei dir ist nun, dass x++ zuerst ausgewertet wird, und der side effect sofort eintritt (also an der Speicherstelle 3 steht) und danach das x ausgewertet wird, dann steht da eben 3=2. Genausogut könnte aber auch x zuerst ausgewertet werden und dann x++, dann steht da eben 2=2. Kurz und kanpp: Man kann nicht sagen, was das Ergebnis ist. Bei kommt 2=2 heraus.



  • pc-dau2 schrieb:

    Hui, Blitzanwort. Oder wurde die Frage so oft gestellt dass es dafür schon nen Antwort-Bot gibt? 😉

    Also gilt die Auswertungsreihenfolge des Shiftoperators nur wenn keine zusätzlichen Anweisungen enthalten sind?

    Wurde auf das Problem bei folgender Anweisung aufmerksam:

    cout << frac1 << " += " << frac2 << " = " << frac1.operator+=(frac2) <<endl;
    

    frac1 enthält schon der Wert der +=Anweisung obwohl diese Anweisung ja erst am Schluss ausgeführt werden sollte.

    Ist dann wohl selbes Problem wie im vereinfachten Beispiel.

    Hab die Anweisung einfach in zwei Teile zerlegt und jetzt passts - ned schön, aber funzt. Man lernt halt nie aus.

    Am besten fährt man wohl immer, wenn die Variable, auf die man eine Operation mit side effect anwendet, im kompletten Ausdruck nur 1x auftaucht. So wie ich dich verstanden habe, hast du das nun auch so gemacht, also das Ganze in 2 komplette Ausdrücke zerlegt.
    :xmas1:



  • frac1.operator+=(frac2)
    
    frac1 += frac2
    

    ist zu kurz? 😛

    bb


Anmelden zum Antworten