 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Markus Breuer Guest
|
Posted: Fri Jun 04, 2004 9:11 am Post subject: postfix increment |
|
|
Ich habe folgenden C++ Code:
int x =4;
int y = x++ + x++;
Compiler 1: x=5 y=8 ( gcc 2.95.2 )
Compiler 2: x=6 y=8 ( Sun CC )
Erwartet habe ich das Ergebnis 2, g++ hat mich allerdings überrascht.
Vor allem aber auch deshalb, weil das Verpacken in eine Wrapper-Klasse
mit angepassten operatoren dann auch das Ergebnis x=6 liefert.
Frage: Ist das nun ein Compilerfehler oder ein Freiraum im Standard?
Gruß Markus
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Fri Jun 04, 2004 9:24 am Post subject: Re: postfix increment |
|
|
Markus Breuer wrote:
| Quote: |
Ich habe folgenden C++ Code:
int x =4;
int y = x++ + x++;
Compiler 1: x=5 y=8 ( gcc 2.95.2 )
Compiler 2: x=6 y=8 ( Sun CC )
Erwartet habe ich das Ergebnis 2, g++ hat mich allerdings überrascht.
Vor allem aber auch deshalb, weil das Verpacken in eine Wrapper-Klasse
mit angepassten operatoren dann auch das Ergebnis x=6 liefert.
Frage: Ist das nun ein Compilerfehler oder ein Freiraum im Standard?
|
Es ist undefiniertes Verhalten.
Du darfst vor dem naechsten Sequenzpunkt den Wert einer Variablen
nur einmal veraendern.
Such mal in der Vergangenheit der Gruppe. Dieses Thema wurde wieder
und wieder und wieder und wieder abgehandelt.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Fri Jun 04, 2004 9:33 am Post subject: Re: postfix increment |
|
|
Karl Heinz Buchegger wrote:
| Quote: |
Markus Breuer wrote:
Ich habe folgenden C++ Code:
int x =4;
int y = x++ + x++;
Compiler 1: x=5 y=8 ( gcc 2.95.2 )
Compiler 2: x=6 y=8 ( Sun CC )
Erwartet habe ich das Ergebnis 2, g++ hat mich allerdings überrascht.
Vor allem aber auch deshalb, weil das Verpacken in eine Wrapper-Klasse
mit angepassten operatoren dann auch das Ergebnis x=6 liefert.
Frage: Ist das nun ein Compilerfehler oder ein Freiraum im Standard?
Es ist undefiniertes Verhalten.
Du darfst vor dem naechsten Sequenzpunkt den Wert einer Variablen
nur einmal veraendern.
|
Da sollte man noch ergaenzen: Wann genau ein Sequenzpunkt eingefuegt wird,
ist etwas dubios und nicht so einfach. Im Standarddokument sind die entsprechenden
Passagen etwas verstruet. Als Daumenregel kannst Du aber nehmen: Ein ';' ist
immer ein Sequenzpunkt. Genauso ist vor dem Aufruf einer Funktion nachdam
alle Argumentet ausgewertet wurden, ein Sequenzpunkt.
Sequenzpunkt bedeutet: Alle Nebeneffekte (wie zb. das Zurueckspeichern des Inkrements
im obigen) muessen abgeschlossen sein.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Heinz Ozwirk Guest
|
Posted: Sat Jun 05, 2004 8:37 am Post subject: Re: postfix increment |
|
|
"Karl Heinz Buchegger" schrieb
| Quote: | Da sollte man noch ergaenzen: Wann genau ein Sequenzpunkt eingefuegt wird,
ist etwas dubios und nicht so einfach. Im Standarddokument sind die entsprechenden
Passagen etwas verstruet. Als Daumenregel kannst Du aber nehmen: Ein ';' ist
immer ein Sequenzpunkt. Genauso ist vor dem Aufruf einer Funktion nachdam
alle Argumentet ausgewertet wurden, ein Sequenzpunkt.
|
Im Prinzip ist das richtig, aber mit den Sequenzpunkten, die durch den Aufruf einer Funktion entstehen, sollte man vorsichtig sein, wenn der Funktionsaufruf Teil eines komplexeren Ausdrucks ist. Der Funktionsaufruf ist nur bezüglich der Berechnung der Argumente ein Sequenzpunkt. So ist durch den Standard garantiert, dass in
++x/*1*/ + f(++x/*2*/, ++x/*3*/)
die Increment Operatoren 2 und 3 ausgeführt wurden, bevor die Funktion aufgerufen wird. Der Standard sagt aber nichts darüber aus, in welcher Reihenfolge 2 und 3 ausgeführt werden müssen. Darüber, ob 1 vor oder nach dem Funktionsaufruf ausgeführt werden soll und in welcher Reihenfolge 1, 2, und 3 ausgeführt werden müssen, wenn 1 vor dem Funktionsauf ausgeführt wird, schweigt sich der Standard aus.
Heinz
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|