副作用が発生する式の評価順序に依存しないようにすること
解説
1, 2のようなコードの動作は未定義であり、 func1から実行されるのかfunc2から実行されるかは処理系依存。 必ず3のような書き方を行い、func1, func2が実行される順番を明示的に指定すること。
#include <stdio.h> int G_a; int x, y, z; int main(void){ /* 1. 非適合例 */ G_a = 11; x = func1() + func2(); //func1から実行されるとは限らない //func1から実行されたのはたまたま printf("x: %d\n", x); /* 2. 非適合例 */ G_a = 11; y = func2() + func1(); //func2から実行されるとは限らない //func2から実行されたのはたまたま printf("y: %d\n", y); /* 3. 適合例 */ G_a = 11; z = func1(); //確実にfunc1から実行される z += func2(); printf("z: %d\n", z); return 0; } int func1(void) { G_a = G_a / 2; return G_a; } int func2(void) { G_a = G_a * 2; return G_a; }
出力
x: 15 y: 33 z: 15