Freigeben über


Nebeneffekte

Die Reihenfolge der Auswertung von Ausdrücken wird durch die spezifische Implementierung definiert, außer wenn die Sprache eine bestimmte Auswertungsreihenfolge sicherstellt (wie in Precedence and Order of Evaluation [Vorrang und Reihenfolge der Auswertung] beschrieben). Zum Beispiel treten Nebeneffekte in den folgenden Funktionsaufrufen auf:

add( i + 1, i = j + 2 );
myproc( getc(), getc() );

Die Argumente eines Funktionsaufrufs können in einer beliebigen Reihenfolge ausgewertet werden. Der Ausdruck i + 1 kann vor i = j + 2 ausgewertet werden bzw. i = j + 2 kann vor i + 1 ausgewertet werden. Das Ergebnis ist in jedem Fall unterschiedlich. Entsprechend ist es nicht möglich, sicherzustellen, welche Zeichen tatsächlich an myproc übergeben werden. Da unäre Inkrementier- und Dekrementiervorgänge Zuweisungen einschließen, können solche Vorgänge Nebeneffekte verursachen, wie im folgenden Beispiel gezeigt:

x[i] = i++;

In diesem Beispiel ist der Wert von x, der geändert wird, unvorhersehbar. Der Wert des Index kann entweder der neue oder der alte Wert von i sein. Das Ergebnis variiert in verschiedenen Compilern oder Optimierungsebenen.

Da C nicht die Reihenfolge der Auswertung von Nebeneffekten definiert, sind beide Bewertungsverfahren, die oben besprochen wurden, korrekt und können implementiert werden. Um sicherzustellen, dass der Code portabel und eindeutig ist, vermeiden Sie Anweisungen, die von einer bestimmten Auswertungsreihenfolge für Nebeneffekte abhängen.

Siehe auch

Ausdrucksauswertung