Effetti collateraliSide Effects

L'ordine di valutazione delle espressioni viene definito dall'implementazione specifica, ad eccezione di quando il linguaggio garantisce un particolare ordine di valutazione, come descritto in Precedenza e ordine di valutazione.The order of evaluation of expressions is defined by the specific implementation, except when the language guarantees a particular order of evaluation (as outlined in Precedence and Order of Evaluation). Ad esempio, gli effetti collaterali si verificano nelle chiamate di funzione seguenti:For example, side effects occur in the following function calls:

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

Gli argomenti di una chiamata di funzione possono essere valutati in qualsiasi ordine.The arguments of a function call can be evaluated in any order. L'espressione i + 1 può essere valutata prima di i = j + 2 o i = j + 2 può essere valutata prima di i + 1.The expression i + 1 may be evaluated before i = j + 2, or i = j + 2 may be evaluated before i + 1. In ciascuno dei casi il risultato sarà differente.The result is different in each case. Ugualmente, non è possibile garantire quali i caratteri vengano effettivamente passati a myproc.Likewise, it is not possible to guarantee what characters are actually passed to the myproc. Poiché operazioni di incrementi unario e di decremento includono assegnazioni, tali operazioni possono causare effetti collaterali, come illustrato nell'esempio seguente:Since unary increment and decrement operations involve assignments, such operations can cause side effects, as shown in the following example:

x[i] = i++;  

In questo esempio, il valore di x che viene modificato è imprevedibile.In this example, the value of x that is modified is unpredictable. Il valore di indice potrebbe essere il valore nuovo o precedente di i.The value of the subscript could be either the new or the old value of i. Il risultato può variare in base a compilatori o livelli di ottimizzazione diversi.The result can vary under different compilers or different optimization levels.

Poiché il linguaggio C non definisce l'ordine di valutazione degli effetti collaterali, entrambi i metodi di valutazione illustrati in precedenza sono corretti ed entrambi possono essere implementati.Since C does not define the order of evaluation of side effects, both evaluation methods discussed above are correct and either may be implemented. Per assicurarsi che il codice sia portabile e chiaro, evitare le istruzioni che dipendono da un particolare ordine di valutazione per gli effetti collaterali.To make sure that your code is portable and clear, avoid statements that depend on a particular order of evaluation for side effects.

Vedere ancheSee Also

Valutazione dell'espressioneExpression Evaluation