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)

プログラミング言語C++ (アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming series)