11

重複の可能性:
これらの未定義の動作(i = i ++ + ++ i、i = i ++など)
の増分値をprintfで説明できる人はいますか?

2つのdouble配列xyとintegerがありiます。私の質問は、ステートメントが次のとおりかどうかです。

double res = x[i] * y[i++];

常にステートメントと同じです:

double res = x[i] * y[i];
i++;

一部のコンパイラがに変更x[i] * y[i++]される可能性はy[i++] * x[i]ありますか?これは明らかに異なる結果を生成しますか?

4

4 に答える 4

13

いいえ-x[i] + y[i++]未定義の動作があります。の値を変更し、シーケンスポイントを介在させずiに値を使用しているため、i未定義の動作が発生します1


  1. C ++ 11では、標準で「シーケンスポイント」という用語が削除されましたが、効果は同じです。2つは相互に順序付けられていません。
于 2012-12-05T18:17:45.983 に答える
8

いいえ、インクリメントが発生するタイミングは未定義です。

于 2012-12-05T18:12:47.537 に答える
6

コードはi、介在するシーケンスポイントなしでその値を変更して使用するため、動作は定義されていません。言語定義は、ここでは要件を課していません。

于 2012-12-05T18:16:06.833 に答える
1

いいえ、

i ++ +i++の 値はとで定義されCていませんC++

式で変数を2回読み取り、その変数も書き込む場合、結果は未定義です。そうしないでください。別の例は次のとおりです。

v[i] = i++;

Undefinedは、そのコンパイラ依存を意味します。
一部のコンパイラは、評価の順序が原因で未定義として警告する場合があります。C++の非常に優れたリファレンス

1 http://www.stroustrup.com/bs_faq2.html#evaluation-order

于 2012-12-05T18:14:49.470 に答える