Auswertungsreihenfolge
Nach oben zu Ausdrücke - Index
Die Reihenfolge, in der der Compiler die Operanden eines Ausdrucks Werte auswertet, ist nicht festgelegt, es sei denn, ein Operator legt eine bestimmte Reihenfolge fest. Der Compiler versucht, den Ausdruck so anzuordnen, dass ein möglichst effizienter Code entsteht. Vorsicht ist daher in solchen Ausdrücken angebracht, in denen ein Wert mehr als einmal modifiziert wird. Generell sollte man die Verwendung von Ausdrücken vermeiden, die Werte eines Objekts sowohl ändern als auch verwenden. Betrachten Sie den folgenden Ausdruck:
i = v[i++]; // i isr undefiniert
Der Wert von i hängt davon ab, ob i vor oder nach der Zuweisung erhöht wird. Genauso ist
int total = 0;
sum = (total = 3) + (++total); // sum = 4 oder sum = 7 ??
für sum und total mehrdeutig. Diese Mehrdeutigkeit kann über eine temporäre Variable aufgelöst werden:
int temp, total = 0;
temp = ++total;
sum = (total = 3) + temp;
Wo die Syntax allerdings eine Auswertungsreihenfolge erzwingt, kann man problemlos mehrere Auswertungen einsetzen:
sum = (i = 3, i++, i++); // OK: sum = 4, i = 5
Jeder Unterausdruck des durch Komma getrennten Ausdrucks in Klammern wird von links nach rechts ausgewertet und der gesamte Ausdruck nimmt den Wert ganz rechts an.
Der Compiler gruppiert Ausdrücke um, indem assoziative und kommutative Operatoren gleicher Klammerungsebene so umgestellt werden, dass ein möglichst effizient compilierter Ausdruck erreicht wird. In keinem Fall beeinflusst die Umgruppierung den Wert des Ausdrucks.