C++ operatoren-addition.

gamemaker83

Ensign
Registriert
Feb. 2009
Beiträge
210
hallo
ich bin neu in der c++-programmierung und versuche die operatoren besser zu verstehen.

ich verstehe diese aufgabe nicht:

a=12
a+=++a+a++;
a=a+a;
cout << a << endl;

welcher wert wird ausgegeben?

es kommt 80 raus.

aber warum 80?

kann mir das bittte jemand erklären.

außerdem brauch ich vorschläge für nützliche links und gute bücher für einsteiger.
ich lese jetzt das buch "C++ Programmierung lernen" - von andre wilms
 
Die allgemeine Antwort lautet: "Die Reihenfolge, in der die Operatoren ausgeführt werden, hängt von ihrer Präzedenz ab." Siehe z. B. hier.

In diesem konkreten Fall wird die Sache dadurch erschwert, daß es in C++ keine eindeutige Antwort gibt. Laut Wiki:

Some languages, such as C and C++, do not specify when the increment occurs, whether immediately before (or after) use, at the beginning (or end) of the statement, or at some point in between. For this reason, referencing a variable more than once in a statement where the increment operator (d. h. '++' - NP) is used results in undefined behavior. The same code may produce different results on different compilers, different architectures, or even the same compiler with different optimization settings.

Das heißt also: Man sollte solche Konstrukte vermeiden, da man sonst unter Umständen böse Überraschungen erlebt.

Warum bei dir 80 herauskommt? Ich vermute, es läuft folgendermaßen. Zuerst werden die beiden '++'-Operatoren betrachtet. Der eine (Präfix) erhöht a sofort auf 13, der andere (Postfix) wartet noch. Dann kommt a += a + a dran. a ist danach 39 und wird vom Postfix-'++' noch auf 40 erhöht. Schlußendlich verdoppelt der nächste Befehl (a = a + a) diesen Wert noch einmal.

Klingt insgesamt alles sinnvoll - nur verlassen kann man sich leider nicht darauf. :(
 
Ich denke das ist in etwa so:

Code:
a=((a+1)+(a+1)+(a+1))+1; //unärer Prefixinkrement-Operator hat höchste Priorität, a wird also sofort zu 13 (a+1), damit wird dann weitergemacht

Aber wie NullPointer schon geschrieben hat, ist das Implementationsabhängig und daher nicht portabel. Daher sollte man hier immer (wenn man sich nicht ganz sicher ist) Klammern benutzen.

außerdem brauch ich vorschläge für nützliche links und gute bücher für einsteiger.
ich lese jetzt das buch "C++ Programmierung lernen" - von andre wilms
Bücher:
C++ Primer (Einsteigerfreundlich)
Die C++ Programmiersprache (Einsteigerfreundlich)

Optional:
(More) exceptional C++ (nicht zu anspruchvoll)
The C++ Standard Library (nicht zu anspruchsvoll)
Modern C++ Design (sehr anspruchsvoll)
The annotated C++ reference manual (Gutes Nachschlagewerk)
etc.



Gruß,

badday
 
Zurück
Oben