FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Allgemeines

Rangfolge von Operatoren (c++)

Rangfolge von Operatoren (c++) 2004-07-21 13:02
schneegurke
Hi!

Ich habe Probleme die folgenden Terme zu verstehen:

1. a = f(*b++);

2. *–c = a;

Wird beim Ersten zuerst b inkrementiert, dann von dem neu entstandenen Wert der Inhalt des Speicherbereichs ermittelt und an die Funktion f übergeben, danach f ausgeführt und am Ende das Ergebnis von f an a zugewiesen?

Beim Zweiten habe ich keinen Schimmer …

Danke!

Re: Rangfolge von Operatoren (c++) 2004-07-21 13:20
asdf
Hi!

Ich habe Probleme die folgenden Terme zu verstehen:

1. a = f(*b++);

2. *–c = a;

Wird beim Ersten zuerst b inkrementiert,

Ne! Erst wird der Wert, auf den b zeigt, als Funktionsargument
benutzt, dann wird b (als Pointer) inkrementiert.

Beim Zweiten habe ich keinen Schimmer …

Erst wird der Pointer c dekrementiert, und auf den Speicher, auf
den c nun zeigt, der Wert a geschrieben.

Re: Rangfolge von Operatoren (c++) 2004-07-21 13:23
a nonymous user
http://www.mezmedia.de/cj-share/03-03-23_ausdruecke/

Re: Rangfolge von Operatoren (c++) 2004-07-21 13:23
schneegurke
Super! Danke für die schnelle Antwort!

Re: Rangfolge von Operatoren (c++) 2004-07-21 13:27
UncleOwen
http://www.mezmedia.de/cj-share/03-03-23_ausdruecke/

C++ & Java
Will die Seite behaupten, C++ und Java hätten die gleichen Auswertungsregeln? Ziemlich gewagtes Statement.
int Teil = 0;
Summe = (Teil = 3) + (++Teil);
Das Ergebnis von Summe kann sowohl den Wert 4 als auch den Wert 7 annehmen, je nachdem welche Klammer zuerst ausgewertet wird.
und zumindest in C++ auch jeden anderen Wert. Undefiniertes Verhalten.

Re: Rangfolge von Operatoren (c++) 2004-07-21 14:27
MoKrates
Ja, das ist laut Standard undefiniertes Verhalten, und damit nicht erlaubt. Schreib sowas nicht. Tut in den Augen weh!

MoKrates

Re: Rangfolge von Operatoren (c++) 2004-07-21 16:55
Anonymer User
Ne! Erst wird der Wert, auf den b zeigt, als Funktionsargument
benutzt, dann wird b (als Pointer) inkrementiert.
Nein, in dem Sinne als das die Reihenfolge der Auswertung festgelegt ist. Und zwar werden erst alle Funktionsargumente ausgewertet und dann beginnt die Ausführung des Funktionskörpers. Allerdings hast du Recht in dem Sinne, dass der Funktion tatsächlich der Wert von "*b" ohne dessen Inkrementierung übergeben wird.

Man muss zwischen der Reihenfolge der Auswertung und deren Bedeutung unterscheiden. Über die Reihenfolge lässt sich bei beiden Ausdrücken ausser dem oben nicht viel sagen. Deren Bedeutung kann man aber korrekt deinen Hinweisen entnehmen.

Relevant sind hier u.A. Absätze 1.9.17 und 5.4 des C++ Standards.
Lehrreich zum Lesen ist auch
http://www.langer.camelot.de/Articles/VSJ/SequencePoints/SequencePoints.html
Ich glaube aber, dass sie nicht ganz korrekt damit umgeht das einige ihrer Beispiele undefiniertes Verhalten hervorrufen, und nicht nur unspezifizierte Ergebnisse.
(Die Problematik wurde hier ja bereits angesprochen)

Wird beim Ersten zuerst b inkrementiert, dann von dem neu entstandenen Wert der Inhalt des Speicherbereichs ermittelt und an die Funktion f übergeben, danach f ausgeführt und am Ende das Ergebnis von f an a zugewiesen?

Wenn nicht gesagt wurde, dass es sich tatsächlich um Zeiger handelt, kannst du nicht einmal davon ausgehen, dass es sich Tatsächlich um Addressen im Speicher handelt.

Re: Rangfolge von Operatoren (c++) 2004-07-22 01:18
schneegurke
Es handelt sich schon um Adressen, dass sieht man im Kontext, den ich allerdings absichtlich nicht mitgepostet habe.

Aber angenommen ich hätte nur diese beiden Zeilen … wie hätte man das denn anders interpretieren sollen/können?

Re: Rangfolge von Operatoren (c++) 2004-07-22 10:58
UncleOwen
Eine Klasse, die den op++ und den op* überladen hat.

Re: Rangfolge von Operatoren (c++) 2004-07-22 12:26
schneegurke
Oh stimmt, da hab ich gar nicht dran gedacht …