X = (x+= 1)+(x+= 1)+(x+= 1) >>> 12 oder 13 oder 15?



  • wiederholte inkrementierung von x ist aber nicht undefined..



  • wäre dies auch undefiniert?

    c* = (a *= 4) * (b += 2);
    

    könntest du das bitte genauer erläutern? Warum das undefiniert ist?



  • x+1 ist identisch mit ++x

    nö, x+1 verändert x nicht.



  • Der Standard sagt:

    "Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored."

    Der einzige Sequence-Point hier ist das Semikolon am Ende der full-expression. Bis dahin wird der Wert von x aber mehr als einmal geändert -> undefiniertes Verhalten.

    Jede weitere Diskussion über mögliche "logische" Ergebnisse ist völlig sinnlos.

    wiederholte inkrementierung von x ist aber nicht undefined..

    Dein Beispiel ist ebenfalls undefiniert.



  • komisch, dann muss ich mich irgendwo verlesen haben...



  • ist denn dieses verhalten hier auch undefiniert?

    int i=0;
    int a=1;
    (i=a)+1;//<--definiert?
    


  • Hallo,

    otze schrieb:

    ist denn dieses verhalten hier auch undefiniert?

    int i=0;
    int a=1;
    (i=a)+1;//<--definiert?
    

    nein, natürlich nicht, denn hier wird nirgends ein und dieselbe Variable im gleichen Ausdruck mehrmals modifiziert (ohne dazwischen liegende "sequence points"), wie im "undefinierten" Beispiel oben. Auch sollte klar sein, daß hier i nach der Ausführung den Wert eins hat (die Addition hat keine Wirkung auf i).

    MfG



  • Was darf alles als Sequenzpunkt angesehen werden? Klammern etc. zählen nicht, richtig?
    (a=b)+=b wäre demnach undefiniert



  • Mis2com schrieb:

    Was darf alles als Sequenzpunkt angesehen werden?

    Mal etwas unformal:

    • Das Ende einer full-expression ist ein Sequence-Point (wenn das Semikolon erreicht wird)
    • Der Aufruf einer Funktion
    • Bei den eingebauten Operatoren &&, ||, ?: und , ist ein Sequence-Point nach der Auswertung der ersten Expression.
    • Am Ende der Kontrollanweisung eines if, while, do und switch-Statements ist ein Sequence-Point
    • Alle drei Expressions im Kopf einer for-Schleife enden in einem Sequence-Point.

    (a=b)+=b wäre demnach undefiniert

    Ja. Zumindest wenn hier die built-in Operatoren aufgerufen werden (a also kein udt mit überladenem +=-Operator ist).



  • Nur ums mal klarzustellen:

    x = x + 1 ist nicht ++x sondern x++! Dann kommt auch 13 raus was richtig ist.

    Anscheinend rechnet der "C++ Builder" erst die incrementierung
    also 2++ 3mal = 5 // somit ist x = 5
    dann 5 + 5 + 5 = 15 gibt.



  • hier mal wie man an die 15 kommt:
    x=2;
    x.operator=(x.operator+(x.operator+(x+=1)+=1)+=1);
    x.operator=(x.operator+(x.operator+(3)+=1)+=1);//zusammenfassung von x+=1, dadurch hat x den wert 3
    x.operator=(x.operator+((3+3)+1)+=1);//ersetzen des +operators durch seinen echten wert(3)
    x.operator=(x.operator+(7)+1);
    x.operator=(7+7+1);//ersetzen des letzten operators(x=7)
    x=15;



  • ja so geht´s auch.

    Er geht also einfach stur durch ohne die klammern zu beachten.

    x = x+=1 ==> x jetzt 3
    x += 3 + 1 ==> x jetzt 7
    x += 7 + 1 ==> x jetzt 15


Anmelden zum Antworten