Inkrementieren - verwirrt
-
LinuxC_newbie schrieb:
36
Och, nö

So ein langer Thread und gar nichts daraus mitgenommen?
-
SeppJ schrieb:
LinuxC_newbie schrieb:
36
Och, nö

So ein langer Thread und gar nichts daraus mitgenommen?Wäre pädagogische evtl. besser mit so etwas wie
int i=1, j=2; cout << X(++i,++j);anzufangen und dann mit dem C-Beispiel weiterzumachen.
-
Wie gesagt: Du sagst wieder: Es ist nicht definiert, stimmts?
Und ich sage wieder: Das kapiere ich nicht.
Es kommt 36 heraus (bei mir).
-
Der Praeprozessor macht nur Textersetzung. Du hast
#define C(D) D*DWenn du nun
cout << C(i++);hast ist "D = i++", also wird C(i++) durch i++ * i++ uebersetzt, d.h. du hast dann
cout << i++ * i++;und das ist undefiniert. Da das Verhalten des Ausdrucks undefiniert ist ist es bloss Zufall, dass bei dir 36 rauskommt.
*Edit
Mein Beitrag ist wohl etwas ueberfluessig... wurde ja eigentlich alles schon gesagt. Habe erst jetzt alle Beitrage zum Thema durchgelesen...
-
Okay, aber WARUM ist das undefiniert?
Was ist daran mehrdeutig oder so, dass es nicht definiert ist?
-
Den Grund hat SeppJ auf der ersten Seite angegeben:
Mehrere Seiteneffekte auf i ohne Sequenzpunkt dazwischen.
Der gleiche Grund warum
int i = 5; i = i++;nicht definiert ist.
-
LinuxC_newbie schrieb:
Was ist daran mehrdeutig
i = 4; i++ * i++ + i++;Ist das nun
4 * 5 + 6?
Oder
4 * 4 + 4?
Oder
6 * 5 + 4?
Oder
5 * 5 + 5?
Oder noch etwas anderes?Bitte mit Begründung.
-
Hier mal ein wenig Text zum Thema Squenzpunkte
http://manderc.manderby.com/operators/sequencepoints/index.php
-
Ich denke, ich habe nun verstanden, wieso das mehrdeutig ist.
Ich bin schockiert, dass ich das in dem Buch ganz klar so gelernt habe, als sei das eindeutig.
-
LinuxC_newbie schrieb:
Ich bin schockiert, dass ich das in dem Buch ganz klar so gelernt habe, als sei das eindeutig.
Daher auch die Kommentare oben über solch ein Buch. Ist leider so, dass vieles auf dem deutschen Markt totaler Schrott ist.