演算子の被演算数に対する評価順序

K&R本 2.12

x = f() + g();

のような文ではfとgの評価順序はどちらでもよい。したがって、もしfとgのどちらか一方が変数を変更し、他方がその変数に従属しているなら、xは実行順序に依存することになる。特別の順序にしたければ、この場合も一時変数を使う手がある。

え・・・。コンパイラによってはgが先に呼び出される可能性があるってことか。

えええ。当然左から順にっていうイメージがあったんだけど考え直さないといけないな。

同様に、関数の引数が評価される順序も指定されないから、文

printf("%d %d\n",++n, power(2,n));

コンパイラによって違った結果になる。

怖いですな。でもコンパイラによって変わるとはいいつつ、おそらく殆どのコンパイラは左から順に評価するんじゃないの?とは思うのだけれどどうなんだろうか。

この辺調べる手段はあるのか?ちょっと不安。

VC2008の環境で一応実験。

#include <stdio.h>
#include <math.h>

int main (void) {
    int i = 1;
    
    printf("%d %f\n",++i,pow(2,i));
    return 0;
}
$ main
2 4.000000

ひとまず一安心。ってかこれが普通だよね。