 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Stefan Ring Guest
|
Posted: Mon Sep 15, 2003 9:23 am Post subject: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Mon Sep 15, 2003 9:29 am Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Mon Sep 15, 2003 9:40 am Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Mon Sep 15, 2003 9:43 am Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Mon Sep 15, 2003 10:01 am Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Mon Sep 15, 2003 4:51 pm Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Mon Sep 15, 2003 7:47 pm Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Mon Sep 15, 2003 10:38 pm Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Tue Sep 16, 2003 5:18 am Post subject: Re: Reihenfolge der Abarbeitung |
|
|
"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
|
Posted: Tue Sep 16, 2003 2:56 pm Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Tue Sep 16, 2003 8:23 pm Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Tue Sep 16, 2003 9:45 pm Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Wed Sep 17, 2003 6:56 am Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Wed Sep 17, 2003 9:42 am Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
|
Posted: Thu Sep 18, 2003 4:12 am Post subject: Re: Reihenfolge der Abarbeitung |
|
|
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
--
<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 |
|
 |
|
|
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
|
|