次のコードがあるとします。
int i = 0;
func(i++, i++);
値を返した直後にインクリメントが発生していますか? 最初の引数が 0 になり、2 番目の引数が 1 になることが保証されていますか?
次のコードがあるとします。
int i = 0;
func(i++, i++);
値を返した直後にインクリメントが発生していますか? 最初の引数が 0 になり、2 番目の引数が 1 になることが保証されていますか?
このコードは、次の 2 つの理由で壊れています。
最初の引数が 0 になり、2 番目の引数が 1 になることが保証されていますか?
いいえ。未定義の動作です。関数の引数の評価の順序は、左から右または右から左であるとは保証されません。つまり、評価の順序が指定されていないため、 on の副作用i
は順不同です。
スカラー オブジェクトに対する副作用が、同じスカラー オブジェクトに対する別の副作用、または同じスカラー オブジェクトの値を使用した値の計算に対して順序付けされていない場合、動作は未定義です [...]
あなたが書くとき、あなたは2つのことが起こるi++
ように求めています:
i
それに 1 を追加しますi
ここで理解しなければならないことは、#1 はすぐに起こりますが、#2 はそうではないということです。#2について考える正しい方法は、それが「いつか」起こるということです。そのため、何をするかは言えませんfunc(i++, i++);
。のいずれかがその結果を2 番目の発生前または後にi++
格納するかどうかを知る方法はありません。i
i++