副作用Side Effects

式の評価の順序は、言語が特定の評価順序を保証する場合を除き、特定の実装によって定義されます (「評価の優先順位と順序」で説明)。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). たとえば、次の関数呼び出しでは副作用が起きます。For example, side effects occur in the following function calls:

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

関数呼び出しの引数は、任意の順序で評価できます。The arguments of a function call can be evaluated in any order. i + 1i = j + 2 の前に評価される場合があり、i = j + 2i + 1 の前に評価される場合があります。The expression i + 1 may be evaluated before i = j + 2, or i = j + 2 may be evaluated before i + 1. それぞれの場合で、結果は異なります。The result is different in each case. 同様に、myproc に実際にどの文字が渡されるかを保証することはできません。Likewise, it is not possible to guarantee what characters are actually passed to the myproc. 単項インクリメントおよびデクリメント演算は代入を含むため、このような操作により、次の例に示すような副作用が発生する可能性があります。Since unary increment and decrement operations involve assignments, such operations can cause side effects, as shown in the following example:

x[i] = i++;

この例では、変更された x の値は予測できません。In this example, the value of x that is modified is unpredictable. 添字の値は i の新規または古い値である可能性があります。The value of the subscript could be either the new or the old value of i. 結果は、コンパイラや最適化レベルが異なると変わります。The result can vary under different compilers or different optimization levels.

C は副作用の評価順序を定義しないため、前に示した評価メソッドはどちらも正しく、どちらでも実行できます。Since C does not define the order of evaluation of side effects, both evaluation methods discussed above are correct and either may be implemented. コードの移植性と明確さを確実に実現するために、副作用に関する評価の特定の順序に依存するステートメントを使用しないでください。To make sure that your code is portable and clear, avoid statements that depend on a particular order of evaluation for side effects.

関連項目See also

式の評価Expression Evaluation