表示: Object Pascal C++
表示設定

評価順序

提供: Appmethod Topics
移動先: 案内, 検索

式:インデックス への移動

演算子によって特に指定されない限り,コンパイラが式のオペランドを評価する順序は特定されません。コンパイラは,生成されるコードの質を高めるために,式を再編成しようとします。したがって,値が何度も変更される式に対しては注意が必要です。一般的には,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



カンマ式中の各部分式は左から右へ評価され,式全体の値は一番右側の値になります。

コンパイラは効率のよい式を作成するために,カッコとは無関係に演算子の結合と交換を行って,式を再グループ化します。どんな場合でも,この再編成が式の値に影響を及ぼすことはありません。

個人用ツール
他言語版