C/C++言語における論理演算の評価順序
C/C++言語では、基本的に、式の評価順序は定められていない。
たとえば、以下のコードでは、f(x) と f(y) のどちらが先に評価されるかわからない。
z = f(x) + f(y);
すなわち、式が左から順に評価されることを期待してコードを書くべきではない。
もう一つ例を挙げると、次のようなケースでも、式の評価順を期待してはいけない。
i = 0; v[i] = i++;
この場合、v[0] とも評価される事があるし、v[1]としても評価される事もある。(実装依存)
ただし、,(カンマ)、||(論理和),&&(論理積) に関しては、左から評価されることが保障されている。
すなわち、以下のようなコードを書くことが出来る
if( i_pHoge && i_pHoge->IsEnable() ){ ... }
わかりづらいのが、,(カンマ)で、これは連続処理演算子の,(カンマ)を意味して、関数の引数を区切る,(カンマ)とは意味が違う。
例えば、
b = ( a = 2, a + 1);
といった、式を書くとbに3が設定されるという意味で、
i = 0; func( v[i], i++ );
こんな関数の場合には、評価の順番は定義されていない。
プログラミング言語C++ (アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming series)
- 作者: Bjarne Stroustrup,長尾高弘
- 出版社/メーカー: アジソンウェスレイパブリッシャーズジャパン
- 発売日: 1998/12/01
- メディア: 単行本
- 購入: 9人 クリック: 272回
- この商品を含むブログ (68件) を見る