Assignments, function calls and sequence points

07/11/2012 - 04:45 von Sebastian Biallas | Report spam
Hallo zusammen,

ist folgender Ausdruck wohldefiniert?

a = 0 * foo(a);

(Soll heißen, darf ein Compiler erst a auf 0 setzen und dann foo(0)
aufrufen).
 

Lesen sie die antworten

#1 Heinz Saathoff
07/11/2012 - 09:10 | Warnen spam
Sebastian Biallas schrieb...
ist folgender Ausdruck wohldefiniert?

a = 0 * foo(a);

(Soll heißen, darf ein Compiler erst a auf 0 setzen und dann foo(0)
aufrufen).



Nein, das darf er nicht. Der Assignment-operator hat die niedrigere
Prioritàt, so dass zuerst die Multiplikation ausgeführt werden muß,
bevor das Ergebnis an a zugewiesen wird.

Man könnte eine andere Frage zu Deinem Beispiel stellen. Da das Ergebnis
der Multiplikation 0 wird, könnte man annehmen, dass der Compiler den
Aufruf von foo(a) wegoptimieren könnte.
Das darf er aber nur, wenn foo keine Seiteneffekte bewirkt! Deshalb ist
die erlaubte Optimierung die Sequenz

foo(a);
a = 0;


- Heinz

Ähnliche fragen