C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

postfix increment

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Markus Breuer
Guest





PostPosted: Fri Jun 04, 2004 9:11 am    Post subject: postfix increment Reply with 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?

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





PostPosted: Fri Jun 04, 2004 9:24 am    Post subject: Re: postfix increment Reply with quote



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





PostPosted: Fri Jun 04, 2004 9:33 am    Post subject: Re: postfix increment Reply with quote



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





PostPosted: Sat Jun 05, 2004 8:37 am    Post subject: Re: postfix increment Reply with quote


"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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.