評価順序
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)
メモ: コンマ演算子の結果は右オペランドの型及び値を持つ。コンマ演算子は,左辺値を返さない。
つまり、コンマ演算子は値を返すけれど、この値に代入はできないってことだ。