Verkettung von Inkrementoperatoren



  • Wenn i = 2 gilt, geben alle unten geschriebenen Operatoren 5, wieso?
    Es ist für mich mich unverständlich, dass ich immer das gleiche Resultat bekommen , obwohl ganz andere Vorzeichen vorhanden sind! Kann mir bitte jemand erklären, wieso das so ist, danke.

    ++i + ++i + ++i
    ++i - ++i - ++i
    ++i + ++i - ++i



  • Alle drei Versionen haben undefiniertes Verhalten, weil i mehrfach zwischen 2 Sequenzpunkten verändert wird. Aber ich vermute, das Problem liegt konkret woanders. Was ist denn 5 ... der Wert von i, oder der Wert des jeweiligen Ausdrucks?



  • 5 ist der Wert aller 3 Ausdrücke. Ich danke dir für deine Antwort, obwohl ich das mit den Sequenzpunkten nicht verstehe.



  • Hmm ... also wie gesagt, ich würde es verstehen, wenn du sagtest, i wär danach immer 5. Die drei Ausdrücke ergeben bei mir die Werte 13, -5, 3. Das ist aber nirgends festgeschrieben, wie gesagt: Undefiniertes Verhalten. Das Programm könnte auch abstürzen.

    Generell ist das Ergebnis undefiniert, wenn man innerhalb eines Ausdrucks eine Variable mehrfach modifiziert, es sei denn es liegt ein Sequenzpunkt dazwischen. Sequenzpunkte sind z.b. Funktionsaufrufe, die && und || Operatoren, der Komma-Operator. Dh. das ist erlaubt: (a == ++i) || (i++ > 42) auch wenn das jetzt ein sinnloser Ausdruck ist 😉



  • Wenn du dich so sehr vor einem i += 2; sträubst schreib doch einfach: (i++ && i++); 😃



  • Das klappt leider nicht, wenn i vorher -1 ist 🙂



  • Stimmt 😞



  • Ich danke für die kompetenten Antworten. Mir ist das mit dem undefinierten Verhalten nun klar. Ausserdem ergebn bei mir auch nach mehrmahligen berechnen alle 3 Ausdrücke 5, was mir wiegesagt nicht logisch war, anscheinend war das aber Zufall.



  • Ich hab nochmal was versucht:

    bei mir gibt wenn i=2

    ++i + ++i (4)
    ++i - ++i (4)

    ++i + ++i + ++i (5)
    ++i - ++i - ++i (5)
    ++i + ++i - ++i (5)

    ++i + ++i + ++i + ++i (6)

    In Klammer steht jeweils der Wert des jeweilgien Ausdruck. Dahinter ist eine klare Regelmässigkeit zusehen. Das erste ++i hat den wer 3, da i=2. Bei jedem weiteren Opeator wird +1 gerechnet, egal ob es sich um eine Addition oder Subtraktion handelt. Ich hab hab keine Ahnung wieso es so ist. Anscheinend ist dies aber nicht bei allen Enwicklungsumgebungen so, da die Ausdrücke bei Bashar andere Werte ergaben. Ich persönlich benutze den Borland C++ Bulder 1.0 Standard.



  • Natuerlich wuerfelt der Compiler hier nicht. Er berechnet die Ausdruecke wie jeden anderen auch. Allerdings ist das Ergebnis nicht definiert, dh er gibt eine Zahl aus, die nur er aus gibt. Jeder andere Compiler kann eine andere Zahl ausgeben und es ist trotzdem 'korrekt'



  • OK, jetzt ist mir alles klar.


Anmelden zum Antworten