論理演算子

C言語では、論理演算子を使用する際に、被演算数の評価順序が左から右に固定されている。そして、その評価の途中で式の結果が確定した場合は、残りの評価は行われない。わかりにくいので例を示すと以下のようになる。

#include <stdio.h>
int f1(void){printf("f1\n"); return 0;}
int f2(void){printf("f2\n"); return 1;}
int main(void)
{
  if ( f1() && f2() ) {  // ここが説明の部分です。
    printf("true\n");
  } else {
    printf("false\n");
  }
  return 0;
}

このプログラムの結果は以下のようになる。

f1
false

f1() が偽(0)を返すとその時点で式の結果が偽で確定してしまうので、そのあと( f2() )は評価されません

この動作について「右側も評価する方が自然なんじゃないの。最適化の結果でこういう動作になるなら別だけど」という話を聞いて、どうなんだろうと思った。

プログラミング言語C第2版(2.12 優先度と評価順序)では「Cでは演算子の被演算数に対する評価順序は指定していない。(例外は, &&, ||, ?: と ','である。)」と書いてあった。C言語的にはごく自然な動作のようです。

私の記憶が正しければ、JavaでもPerlでも同じ動作だったと思うのだけど、右側まで評価されても安全に実行できるよう書いたほうがいいのかもしれない。