次の式を使用します。
(x++, y) + (y++, x)
左から右に評価します。
x++ // yield 0, schedule increment of x
, // sequence point: x definitely incremented now
y // yield 0
y++ // yield 0, schedule increment of y
// explode because you just read from y and wrote to y
// with no intervening sequence point
これを禁止する標準は何もないため、全体の動作は未定義です。
次の疑似コードを比較してください。
f() { return x++, y; }
g() { return y++, x; }
f() + g()
C99 (5.1.2.3/2) によると、f
およびの呼び出しg
自体が副作用としてカウントされ、関数呼び出し演算子には、関数に入る直前にシーケンス ポイントが含まれます。これは、関数の実行がインターリーブできないことを意味します。
「並行して評価する」モデルでは、次のようになります。
f() // arbitrarily start with f: sequence point; enter f
g() // at the same time, start calling g: sequence point
の実行f
自体が副作用としてカウントされるため、 のシーケンス ポイントは、が戻るg()
まで実行を中断します。f
したがって、未定義の動作はありません。