-2

次のコードがあるとします。

int i = 0;
func(i++, i++);

値を返した直後にインクリメントが発生していますか? 最初の引数が 0 になり、2 番目の引数が 1 になることが保証されていますか?

4

4 に答える 4

7

このコードは、次の 2 つの理由で壊れています。

  • 格納する値を決定する以外の目的で、シーケンス ポイント間で変数に 2 回アクセスすることは、未定義の動作です。関数パラメーターの評価の間にシーケンス ポイントはありません。何かが起こる可能性があることを意味し、プログラムがクラッシュして燃える可能性があります (または、誤った値やゴミの値を表示する可能性が高くなります)。
  • 関数パラメーターの評価の順序は指定されていない動作です。つまり、最初に評価されるパラメーターを知ることはできません。

未定義の動作とシーケンス ポイント

これらの構成 (++ を使用) が未定義の動作になるのはなぜですか?

于 2015-06-23T10:55:39.103 に答える
0

最初の引数が 0 になり、2 番目の引数が 1 になることが保証されていますか?

いいえ。未定義の動作です。関数の引数の評価の順序は、左から右または右から左であるとは保証されません。つまり、評価の順序が指定されていないため、 on の副作用iは順不同です。

C11:6.5 式 (p2)

スカラー オブジェクトに対する副作用が、同じスカラー オブジェクトに対する別の副作用、または同じスカラー オブジェクトの値を使用した値の計算に対して順序付けされていない場合、動作は未定義です [...]

于 2015-06-23T10:53:12.277 に答える
-1

あなたが書くとき、あなたは2つのことが起こるi++ように求めています:

  1. の値を取得し、iそれに 1 を追加します
  2. 結果を格納しますi

ここで理解しなければならないことは、#1 はすぐに起こりますが、#2 はそうではないということです。#2について考える正しい方法は、それが「いつか」起こるということです。そのため、何をするかは言えませんfunc(i++, i++);。のいずれかがその結果を2 番目の発生前または後にi++格納するかどうかを知る方法はありません。ii++

于 2015-06-23T10:58:22.170 に答える