演算子の被演算数に対する評価順序
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
ひとまず一安心。ってかこれが普通だよね。