評価順序

i = 0; f(i++, i++); が f(0, 1); と書かれたものを見て、ヘイヘイ!とおもったのでエントリー。

関数引数の評価順序は実装依存。 f(i++, i++) は、その関数呼び出しが行われる直前で f(0, 1) か f(1, 0) かが決定しているけれど、どちらになるかは規格は定めていない。つまり、どちらになるかはコンパイラの実装次第。

6.3.2.2 関数呼び出し -- C 言語規格 (C90)

関数指示子,実引数及び実引数内の部分式の評価順序は未規定とするとするが,実際に呼出しが行われる前に副作用完了点がある。


似たようなものにコンマ演算子があるけれど、こちらは左から右と評価順序は決まっている。
つまり f(), g(); と書いた場合、 f() の評価 (呼び出し) が完了してから g() が評価される。

6.3.17 コンマ演算子 -- C 言語規格 (C90)

コンマ演算子は,左オペランドをボイド式として評価する。その評価の直後を副作用完了点とする。次に右オペランドを評価する。


メモ: コンマ演算子の結果は右オペランドの型及び値を持つ。コンマ演算子は,左辺値を返さない。

つまり、コンマ演算子は値を返すけれど、この値に代入はできないってことだ。