[GELÖST - UB] Multiple Präfix-Verwendung: ++i = ++i + ++i (Verständnis von HorrorCode)



  • Hallo,

    bitte entschuldigt, dass ich hier mit HorrorCode aufkreuze. Aber ich habe einmal folgenden Code probiert und verstehe das Ergebnis nicht:

    int i=0;
    ++i = ++i + ++i;
    cout<<"i = "<<i;
    

    Angezeigt wurde i = 6. Das verstehe ich nicht. Offensichtlich fängt er links an, erhöht also

    1. beim Einstieg in die Formel i=1 aufgrund ++lvalue.
    2. dann wird der erste Summand auf 2 erhöht
    3. der zweite Summand wird auf 3 erhöht
    4. 2 + 3 müssten aber 5 ergeben.

    Wiese kommt dann 6 heraus? Irgendwie habe ich das Gefühl, dass er erst beide Summanden speichert und dann addiert, also erst den rvalue i nach dreifacher Inkrementierung auf 3 erhöht und dann 3+3 = 6 rechnet. Ist das standardisiert oder schlicht der Compiler (Code Blocks)?

    Ich will lediglich den Compiler und die Präfixtechnik verstehen, dass der Code oben keine sinnvolle Lösung sein kann, verstehe ich.

    Wieso fängt er überhaupt beim lvalue und nicht beim rvalue an, also 1+2 = 3 oder 2+2 = 4. Bei C# ist meines Wissens auch lvalue-Präfix verboten.

    Wenn solche Fragen hier nicht gewünscht sind, bitte Hinweis, dann lasse ich so etwas selbstverständlich.



  • Solche wirren Konstrukte sollte man besser sein lassen.


  • Mod

    Da gibt es nichts zu verstehen, das ist undefiniertes Verhalten. Da kann genau so gut "C̠̬͖͎̥̩t̼͍̻ḥ̶̱͈ù̦̲̜͓̹̜l̸̞͚ṷ̱̭̩̻̼̻̕" statt 6 heraus kommen.



  • Teste mal

    int i=0, a, b, c;
    a = ++i = (b=++i) + (c=++i);
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
    cout<<"i = "<<i<<endl;
    

    Selbstverständlich ist diese Konstruktion UB (undefined behavior).

    PS: Bei ideone: gcc 6.3 kommt 5 heraus.



  • SeppJ schrieb:

    C̠̬͖͎̥̩t̼͍̻ḥ̶̱͈ù̦̲̜͓̹̜l̸̞͚ṷ̱̭̩̻̼̻̕

    😃



  • SeppJ schrieb:

    Da gibt es nichts zu verstehen, das ist undefiniertes Verhalten. Da kann genau so gut "C̠̬͖͎̥̩t̼͍̻ḥ̶̱͈ù̦̲̜͓̹̜l̸̞͚ṷ̱̭̩̻̼̻̕" statt 6 heraus kommen.

    Wie kann man das einem int zuweisen?


  • Mod

    Mechanics schrieb:

    SeppJ schrieb:

    Da gibt es nichts zu verstehen, das ist undefiniertes Verhalten. Da kann genau so gut "C̠̬͖͎̥̩t̼͍̻ḥ̶̱͈ù̦̲̜͓̹̜l̸̞͚ṷ̱̭̩̻̼̻̕" statt 6 heraus kommen.

    Wie kann man das einem int zuweisen?

    Du hast undefiniertes Verhalten nicht verstanden, wenn du denkst, das wäre ein Problem.

    Um konkret zu werden: Das UB könnte ja auch den Programmcode kaputt machen.


Log in to reply