分享方式:


副作用

運算式的評估順序是由特定實作定義,但語言保證特定評估順序者除外 (如評估的優先順序和順序中所述)。 例如,副作用會在下列函式呼叫中發生:

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

函式呼叫的引數可以依照任何順序進行評估。 運算式 i + 1 可以在 i = j + 2 之前評估,或者 i = j + 2 也可以在 i + 1 之前評估。 每種情況產生的結果各不相同。 同樣,都無法保證實際會傳遞什麼字元至 myproc。 由於一元的遞增和遞減作業與指派相關,因此這類作業可能會造成副作用,如下列範例所示:

x[i] = i++;

在此範例中,無法預期 x 修改過的值。 下標的值可以是 i 的新值或舊值。 結果可能會依不同的編譯器或不同的最佳化層級而異。

由於 C 不會定義副作用的評估順序,因此以上所討論的兩種評估方法均正確,並且可以實作其中任何一種。 若要確定程式碼的可攜性和明確性,請避免使用依賴特定副作用評估順序的陳述式。

另請參閱

運算式評估