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 

Reihenfolge der Abarbeitung
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Stefan Ring
Guest





PostPosted: Mon Sep 15, 2003 9:23 am    Post subject: Reihenfolge der Abarbeitung Reply with quote



Folgendes Codestück:

int a;
if (
(a = b) < 10
#ifdef SOMETHING
&& (a = c) < 8
#endif
)
{
// welchen Wert hat a hier?
}

Ist garantiert, dass a den Wert von c hat, wenn der untere Vergleich
aktiviert ist?

--
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
Jirka Klaue
Guest





PostPosted: Mon Sep 15, 2003 9:29 am    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote



Stefan Ring wrote:

Quote:
Folgendes Codestück:

int a;
if (
(a = b) < 10
#ifdef SOMETHING
&& (a = c) < 8
#endif
)
{
// welchen Wert hat a hier?
}

Ist garantiert, dass a den Wert von c hat, wenn der untere Vergleich
aktiviert ist?

Ja.

Jirka


--
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
Christoph Rabel
Guest





PostPosted: Mon Sep 15, 2003 9:40 am    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote



Stefan Ring wrote:
Quote:
Folgendes Codestück:

int a;
if (
(a = b) < 10
#ifdef SOMETHING
&& (a = c) < 8
#endif
)
{
// welchen Wert hat a hier?
}

Ist garantiert, dass a den Wert von c hat, wenn der untere Vergleich
aktiviert ist?

Ja.

mfg

Christoph

--
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
Stefan Reuther
Guest





PostPosted: Mon Sep 15, 2003 9:43 am    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

Hallo,

Stefan Ring <e9725446 (AT) stud3 (DOT) tuwien.ac.at> wrote:
Quote:
if (
(a = b) < 10
#ifdef SOMETHING
&& (a = c) < 8
#endif
)
{
// welchen Wert hat a hier?
}

Ist garantiert, dass a den Wert von c hat, wenn der untere Vergleich
aktiviert ist?

Nein, denn wenn '(a = b) < 10' false liefert, wird der untere
Vergleich nicht ausgewertet.


Stefan

--
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
Christoph Rabel
Guest





PostPosted: Mon Sep 15, 2003 10:01 am    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

Stefan Reuther wrote:
Quote:
Stefan Ring <e9725446 (AT) stud3 (DOT) tuwien.ac.at> wrote:

if (
(a = b) < 10
#ifdef SOMETHING
&& (a = c) < 8
#endif
)
{
// welchen Wert hat a hier?
}

Ist garantiert, dass a den Wert von c hat, wenn der untere Vergleich
aktiviert ist?

Nein, denn wenn '(a = b) < 10' false liefert, wird der untere
Vergleich nicht ausgewertet.

Die Frage steht im true Zweig der if Abfrage. Dort ist es garantiert.
Ausserhalb der Klammern natürlich nicht.

mfg

Christoph

--
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
Stefan Ring
Guest





PostPosted: Mon Sep 15, 2003 4:51 pm    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

Jetzt kommt die knifflige Zusatzfrage :)

Modifizieren wir das ganze so:

if ( (a=b++) < 10 && (a=b++) < 8 )
{
}

Es geht wieder um den Wert von a im true-Zweig.

Hat a wohldefiniert den Wert (ursprüngliches b + 1) oder ist das
undefiniertes Verhalten? Also es läuft darauf hinaus, ob && ein Sequence
Point ist (wenn das in dem Zusammenhang so heißt).

--
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
Kostka, Volkmar
Guest





PostPosted: Mon Sep 15, 2003 7:47 pm    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote


Hallo,

Stefan Ring wrote:
Quote:
Jetzt kommt die knifflige Zusatzfrage :)

Modifizieren wir das ganze so:

if ( (a=b++) < 10 && (a=b++) < 8 )
{
}

Es geht wieder um den Wert von a im true-Zweig.

Hat a wohldefiniert den Wert (ursprüngliches b + 1) oder ist das
undefiniertes Verhalten? Also es läuft darauf hinaus, ob && ein Sequence
Point ist (wenn das in dem Zusammenhang so heißt).


&& ist *immer* ein Sequenzpunkt.

Wenn der Wert der obigen Anweisung "true" werden soll, muessen beide
Teilausdruecke true sein. Daher muessen beide Teilausdruecke ausgewertet
werden. Und da && ein Sequenzpunkt ist, ist das Ergebnis wohl definiert.

MFG

Volkmar Kostka

--
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
Horst Kraemer
Guest





PostPosted: Mon Sep 15, 2003 10:38 pm    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

On Mon, 15 Sep 2003 18:51:56 +0200, Stefan Ring
<e9725446 (AT) stud3 (DOT) tuwien.ac.at> wrote:

Quote:
Jetzt kommt die knifflige Zusatzfrage :)

Modifizieren wir das ganze so:

if ( (a=b++) < 10 && (a=b++) < 8 )
{
}

Es geht wieder um den Wert von a im true-Zweig.

Hat a wohldefiniert den Wert (ursprüngliches b + 1) oder ist das
undefiniertes Verhalten? Also es läuft darauf hinaus, ob && ein Sequence
Point ist (wenn das in dem Zusammenhang so heißt).

Obiges hat exakt dasselbe Verhalten wie

if ((a=b++) < 10)
if (a=b++) < 8 )
{
}


Ja, der linke Operand von && (und ||) wird zuerst ausgewertet, und
nach der Auswertung des linken Operanden liegt ein sequence point.

MfG
Horst

--
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
Michael Trocken
Guest





PostPosted: Tue Sep 16, 2003 5:18 am    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

"Kostka, Volkmar" <volkmarkostka (AT) t-online (DOT) de> wrote

Quote:
Stefan Ring wrote:
Also es läuft darauf hinaus, ob && ein Sequence
Point ist (wenn das in dem Zusammenhang so heißt).


&& ist *immer* ein Sequenzpunkt.

außer es ist überladen.


Michael

--
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
Torsten Robitzki
Guest





PostPosted: Tue Sep 16, 2003 2:56 pm    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

Michael Trocken wrote:
Quote:
"Kostka, Volkmar" <volkmarkostka (AT) t-online (DOT) de> wrote


Stefan Ring wrote:

Also es läuft darauf hinaus, ob && ein Sequence
Point ist (wenn das in dem Zusammenhang so heißt).


&& ist *immer* ein Sequenzpunkt.


außer es ist überladen.

Dann ist es ein Funktionsaufruf und damit erst recht ein Sequenzpunkt,
allerding werden dann beide Argument in jedem Fall ausgewertet.

mfg Torsten

--
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
Kai Ruhnau
Guest





PostPosted: Tue Sep 16, 2003 8:23 pm    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

Torsten Robitzki wrote:

Quote:
Michael Trocken wrote:
"Kostka, Volkmar" <volkmarkostka (AT) t-online (DOT) de> wrote


Stefan Ring wrote:

Also es läuft darauf hinaus, ob && ein Sequence
Point ist (wenn das in dem Zusammenhang so heißt).

&& ist *immer* ein Sequenzpunkt.

außer es ist überladen.

Dann ist es ein Funktionsaufruf und damit erst recht ein Sequenzpunkt,
allerding werden dann beide Argument in jedem Fall ausgewertet.

Ist die Reihenfolge der Auswertungen denn dann noch definiert?

Class Int; //Wie int mit überladenem &&
Int a(1);
if ((a++)&&(a++))
// a.operator&&(1,2) oder a.operator(2,1)?

Grüße
Kai

--
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
Torsten Robitzki
Guest





PostPosted: Tue Sep 16, 2003 9:45 pm    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

Hi Kai,

Kai Ruhnau wrote:

Quote:
Torsten Robitzki wrote:


Michael Trocken wrote:


Dann ist es ein Funktionsaufruf und damit erst recht ein Sequenzpunkt,
allerding werden dann beide Argument in jedem Fall ausgewertet.


Ist die Reihenfolge der Auswertungen denn dann noch definiert?

Class Int; //Wie int mit überladenem &&
Int a(1);
if ((a++)&&(a++))
// a.operator&&(1,2) oder a.operator(2,1)?

nein, da die Reihenfolge in der die Argumente bei einem Funktionsaufruf
ausgewertet werden nicht definiert sind. Dazu gibt es ganz viele threads
in diesem Forum, meist im Zusammenhang mit code wie
std::cout<
mfg Torsten

--
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
Kai Ruhnau
Guest





PostPosted: Wed Sep 17, 2003 6:56 am    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

Torsten Robitzki wrote:

Quote:
Hi Kai,

Kai Ruhnau wrote:

Torsten Robitzki wrote:

Michael Trocken wrote:

Dann ist es ein Funktionsaufruf und damit erst recht ein Sequenzpunkt,
allerding werden dann beide Argument in jedem Fall ausgewertet.

Ist die Reihenfolge der Auswertungen denn dann noch definiert?

Class Int; //Wie int mit überladenem &&
Int a(1);
if ((a++)&&(a++))
// a.operator&&(1,2) oder a.operator(2,1)?

nein, da die Reihenfolge in der die Argumente bei einem Funktionsaufruf
ausgewertet werden nicht definiert sind. Dazu gibt es ganz viele threads
in diesem Forum, meist im Zusammenhang mit code wie
std::cout<

Ja, ich hab meine Verwunderung falsch ausgedrückt.

class Int
{
private:
int mi;
public
Int(int i=0): mi(i)
{}
Int& operator++()
{
++mi;
return *this;
}
operator bool() const
{
return (mi!=0);
}
};

Int a;

Mit dieser Klasse ist

if ((++a)&&(++a))

eindeutig definiert. Wenn ich nun aber entscheide, dass ich operator&&
lieber überladen möchte, weil beispielsweise die Konvertierung nach bool
nicht unbedingt immer das wahre ist, wird der Ausdruch undefiniert.

Wie kann ich als Benutzer der Klasse entscheiden, ob operator&& ein
Sequenzpunkt oder überladen ist?

Als Möglichkeit fällt mir jetzt bloß

if (++a)
if (++a)

ein. Aber dann brauche ich operator&& auch nicht überladen.

Grüße
Kai

--
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
Falk Tannhäuser
Guest





PostPosted: Wed Sep 17, 2003 9:42 am    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

Stefan Ring wrote:
Quote:

std::cout<
Gibt's denn keinen Compiler, der bei sowas Warnings ausspuckt? Bei den von
mir verwendeten ist mir das zumindest noch nie aufgefallen. Die Erfahrung
zeigt nun mal, dass Leute solche Konstrukte verwenden, wenn es auf ihrem
Compiler eh funktioniert.
gcc 3.x hat die Option -Wsequence-point, die aber im Moment dummerweise nur

für C funkioniert, für C++ muss man sich offenbar noch etwas gedulden.
Ich glaube aber nicht, dass ein Compiler kompliziertere Fälle wie z.B. den
folgenden erkennen könnte, insbesondere wenn die Funktionen sich in
verschiedenen Übersetzungseinheiten befinden:

void foo(int& a, int& b) { std::cout << ++a << ' ' << ++b << 'n'; }

int main()
{
int n = 666;
foo(n, n);
return 0;
}

Falk

--
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
Dietmar Kuehl
Guest





PostPosted: Thu Sep 18, 2003 4:12 am    Post subject: Re: Reihenfolge der Abarbeitung Reply with quote

Kai Ruhnau wrote:
Quote:
Als Möglichkeit fällt mir jetzt bloß

if (++a)
if (++a)

Was spricht gegen folgendes?

if (bool(++a) && bool(++a))
...

Es wäre mal interessant zu gucken, wo man irgendwelche Bibliotheken,
wie etwas die Standardbibliothek, mit dem Überladen von Operatoren
aufs Kreuz legen kann: derzeit gibt es nur relativ einfache
Anforderungen an die verwendeten Klassen, die insbesondere sowas wie
einen eigenen Boolschen Typ nicht ausschließen, aber auch keine
speziellen Sachen fordern, wie zB. dass es keinen überladenen
operator&&() gibt. Offenbar ist man gut beraten, sich entweder gegen
Überladungen zu schützen oder, wahrscheinlich noch besser, Seiteneffekte
in solchen Ausdrücken zu vermeiden...

Hier ist ein Beispiel aus einer kommerziellen Standardbibliothek
(allerdings aus einer älteren Version), wo sowas Probleme machen
kann:

...
for (; _First1 != _Last1 && *_First1 == *_First2; )
...

Alle Variablen haben einen Typ, der vom Benutzer definiert werden
kann. Wenn operator!=() auf diesen Iteratoren eine Boolsche Klasse
liefert, für die operator&&() überladen ist, wirds spaßig Smile
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
Phaidros eaSE - Easy Software Engineering: <http://www.phaidros.com/>

--
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
Goto page 1, 2  Next
Page 1 of 2

 
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.