評価順序
式:インデックス への移動
演算子によって特に指定されない限り,コンパイラが式のオペランドを評価する順序は特定されません。コンパイラは,生成されるコードの質を高めるために,式を再編成しようとします。したがって,値が何度も変更される式に対しては注意が必要です。一般的には,1 つの式の中で,同じオブジェクトの値を修正し,また使用するような式を書くことは避けるべきです。次の式を考えてみてください。
i = v[i++]; // i は未定義
i の値は,i が代入の前にインクリメントされるか,あるいは代入の後にインクリメントされるかによって異なります。同様に次の式では,
int total = 0;
sum = (total = 3) + (++total); // sum = 4 あるいは sum =7 ??
sum と total の値は明確ではありません。これは,一時的変数を用いて式を分割すれば解決することができます。
int temp, total = 0;
temp = ++total;
sum = (total = 3) + temp;
評価順序が強制される構文では,複合式を使用するのが安全です。
sum = (i = 3, i++, i++); // OK: sum = 4, i = 5
カンマ式中の各部分式は左から右へ評価され,式全体の値は一番右側の値になります。
コンパイラは効率のよい式を作成するために,カッコとは無関係に演算子の結合と交換を行って,式を再グループ化します。どんな場合でも,この再編成が式の値に影響を及ぼすことはありません。