 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jörg Baumann Guest
|
Posted: Sun Nov 02, 2003 12:54 pm Post subject: Undefiniertes Verhalten? |
|
|
Ist
index = index != 0 ? --index: 0;
undefiniertes Verhalten?
--
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 |
|
 |
Robert W. Kuhn Guest
|
|
| Back to top |
|
 |
Jörg Baumann Guest
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Sun Nov 02, 2003 3:01 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
Robert W. Kuhn wrote:
Ich seh da nix zum bedingten Ausdrucks-Operator. Setzt der bedingte
Ausdrucks-Operator einen Seqenzpunkt, oder setzt er keinen? Kann es also
sein, daß vor dem Vergleich bereits dekrementiert wurde?
--
Georg Maaß - bioshop.de D-76187 Karlsruhe, Hertzstraße 180a
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimative DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul
--
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 |
|
 |
Jörg Baumann Guest
|
Posted: Sun Nov 02, 2003 3:30 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
Georg Maaß wrote:
| Quote: | Ich seh da nix zum bedingten Ausdrucks-Operator. Setzt der bedingte
Ausdrucks-Operator einen Seqenzpunkt, oder setzt er keinen? Kann es also
sein, daß vor dem Vergleich bereits dekrementiert wurde?
|
Soweit ich den Standard verstehen ist das "?" in "a ? b : c" ein
sequencepoint (§1.9.1 .
Zusammen mit §15.6 gibt das:
Auswertung von A, sequencepoint, Auswertung von b oder c, Zuweisung
Aber die Zuweisung ist ja generell kein sequencepoint.
Ist dann "i = doInc? i++: i--;" für "(doInc == true)" wie "i = i++;" (=UB)
oder wie "i = ident(i++);" zu behandeln (mit "template<typename T> T
indent(T t) {return t;}").
Für überladenen operator++ ist es ja einfach da dann ++ ein eigener
sequencepoint ist (und wir indent mit etwaigen Nebeneffekten weglassen
können).
Aber für builtins?
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Sun Nov 02, 2003 4:57 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
"Jörg Baumann" <joerg.baumann (AT) stud (DOT) uni-erlangen.de> schrieb:
| Quote: | index = index != 0 ? --index: 0;
undefiniertes Verhalten?
|
Definitiv.
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Sun Nov 02, 2003 4:59 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
"Jörg Baumann" <joerg.baumann (AT) stud (DOT) uni-erlangen.de> schrieb:
| Quote: | Aber ?: ist doch ein Sequenzpunkt.
|
Einen Operator mit 3 Operanden einfach als "Sequenzpunkt" zu
bezeichnen, kann nur zu Mißverständnissen führen. Ja, da ist
(genau) ein Sequenzpunkt nach der Auswertung des ersten Ope-
randen (dem links vom »?«).
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Sun Nov 02, 2003 5:00 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb:
| Quote: | index = index != 0 ? --index: 0;
undefiniertes Verhalten?
Definitiv.
Warum?
|
Weil es keinen Sequenzpunkt zwischen Dekrement und Zuweisung gibt.
--
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 |
|
 |
Rolf Magnus Guest
|
Posted: Sun Nov 02, 2003 5:55 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
Markus Schaaf wrote:
| Quote: | "Jörg Baumann" <joerg.baumann (AT) stud (DOT) uni-erlangen.de> schrieb:
index = index != 0 ? --index: 0;
undefiniertes Verhalten?
Definitiv.
|
Warum?
--
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 |
|
 |
Thomas Maeder Guest
|
Posted: Sun Nov 02, 2003 7:13 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
Jörg Baumann <joerg.baumann (AT) stud (DOT) uni-erlangen.de> writes:
| Quote: | Aber ?: ist doch ein Sequenzpunkt.
|
Nur das ? davon. Nachher wird ohne dazwischen liegenden Sequenzpunkt
dekrementiert und zugewiesen.
--
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 |
|
 |
Hendrik Belitz Guest
|
Posted: Fri May 07, 2004 1:45 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
Mark Henning wrote:
| Quote: | Nun wurde mir von jemandem gesagt, die Zeile
*(++pfSources) = -(*(++pfSources) = 1);
sei so nicht O.K. -> undefiniertes Verhalten.
Stimmt das so? Ich dachte immer, solche Ausdrücke würden grundsätzlich
von rechts nach links aufgelöst werden, was zur Folge hätte, dass es
eben kein undefinierter Ausdruck wäre?
|
Ein Ausdruck ja, aber Du hast da ja noch eine Zuweisung zwischen. Ob
nun zuerst der Pointer vor dem Gleichheitszeichen oder der hinter dem
Gleichheitszeichen inkrementiert wird, das ist tatsächlich nicht definiert.
--
To get my real email adress, remove the two onkas
--
Dipl.-Inform. Hendrik Belitz
Central Institute of Electronics
Research Center Juelich
--
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: Fri May 07, 2004 2:21 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
On Thu, 06 May 2004 13:17:13 +0200, Mark Henning <mh (AT) homolog (DOT) de>
wrote:
| Quote: | Nun wurde mir von jemandem gesagt, die Zeile
*(++pfSources) = -(*(++pfSources) = 1);
sei so nicht O.K. -> undefiniertes Verhalten.
Stimmt das so?
|
Ja. Dieses Ausdruck ist Selbstmord ;-)
| Quote: | Ich dachte immer, solche Ausdrücke würden grundsätzlich
von rechts nach links aufgelöst werden, was zur Folge hätte, dass es
eben kein undefinierter Ausdruck wäre?
|
Vielleicht verwechselst Du es mit Java. Dort werden Ausdruecke
allerdings immer von links nach rechts aufgeloest.
--
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 |
|
 |
Stefan Reuther Guest
|
Posted: Fri May 07, 2004 6:09 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
Mark Henning wrote:
| Quote: | Nun wurde mir von jemandem gesagt, die Zeile
*(++pfSources) = -(*(++pfSources) = 1);
sei so nicht O.K. -> undefiniertes Verhalten.
|
Stimmt.
| Quote: | Stimmt das so? Ich dachte immer, solche Ausdrücke würden grundsätzlich
von rechts nach links aufgelöst werden,
|
Eine solche Regel gibt es nicht. Der Compiler ist vollkommen frei, den
Ausdruck in einer Reihenfolge seiner wahl zu bewerten. Das einzige,
woran er sich halten muss, sind Sequenzpunkte. Das sind, grob gesagt,
Semikolons, Kommaoperator, ||, && und ?:, sowie Funktionsaufrufe. Dein
Code enthält keine Sequenzpunkte.
Du velwechserst das vielleicht damit, dass auf vielen (nicht allen)
Compilern die Argumente von rechts nach links ausgewertet werden. Das
ist aber ebenfalls kein "Gesetz". Die einzige Regeln für Parameter einer
Funktion ist, dass die Parameter ausgewertet sein müssen, bevor die
Funktion aufgerufen wird. In welcher Reihenfolge das geschieht, ist
egal. Siehe auch <c0e91s.uk.1 (AT) stefan (DOT) msgid.phost.de>.
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 |
|
 |
Thomas Maeder Guest
|
Posted: Fri May 07, 2004 10:05 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
Mark Henning <mh (AT) homolog (DOT) de> writes:
| Quote: | Hat das einen tieferen Grund? Oder ist das "einfach so" undefiniert
geblieben?
|
Die Compilerhersteller sollen nicht am Optimieren gehindert werden.
--
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 |
|
 |
Raymond Haeb Guest
|
Posted: Sat May 08, 2004 2:51 pm Post subject: Re: Undefiniertes Verhalten? |
|
|
Es begab sich, daß Stefan Reuther schrieb:
| Quote: | Eine solche Regel gibt es nicht. Der Compiler ist vollkommen frei, den
Ausdruck in einer Reihenfolge seiner wahl zu bewerten. Das einzige,
woran er sich halten muss, sind Sequenzpunkte. Das sind, grob gesagt,
Semikolons, Kommaoperator, ||, && und ?:, sowie Funktionsaufrufe. Dein
Code enthält keine Sequenzpunkte.
|
Wie ist das mit den Sequenzpunkten zu verstehen? Ist sowas definiertes
Verhalten:
obj.get_next_item() = obj.get_next_item() + 42;
Raymond
--
Bitte kein BCC an mich, wegen Swen-Filter.
(Positivliste für To: und Cc:)
--
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
|
|