4

重複の可能性:
未定義の動作とシーケンスポイント

#include <iostream>
using namespace std;

int main()
{
int x[3] = {};
int i=0;
x[i] = i++;
cout << x[0] << " " << x[1] << endl;
return 0;
}

コードパッドは私にこれを与えています:9行目:警告:「i」の操作が未定義である可能性がありますなぜ操作が未定義なのですか?

4

2 に答える 2

7

ここで明確に説明されています: C-FAQ

このコードが機能しないのはなぜ a[i] = i++;ですか?

部分式i++は副作用を引き起こします-それはsの値を変更します-それは同じ式の他の場所でも参照されるi'ので未定義の振る舞いにつながります。i参照が副作用の前に起こるのか後に起こるのかを知る方法はありません。実際、どちらの明白な解釈も成り立たないかもしれません。質問3.9を参照してください。(K&Rの言語は、この式の動作が指定されていないことを示唆していますが、C標準はそれが未定義であるというより強力なステートメントを作成していることに注意してください。質問11.33を参照してください。)

関連する標準見積もりは次のとおりです。

C ++ 03 5式[expr]:
パラ4:

....
前のシーケンスポイントと次のシーケンスポイントの間で、スカラーオブジェクトは、式の評価によって、格納されている値を最大で1回変更する必要があります。さらに、前の値は、保存される値を決定するためにのみアクセスされるものとします。この段落の要件は、完全な式の部分式の許容される順序ごとに満たされるものとします。それ以外の場合、動作は未定義です。

于 2012-06-21T05:52:59.263 に答える
5

変数を変更し、介在するシーケンスポイントなしでその値を使用しています。i表示されるときの値は何だと思いますx[i]か?あなたが期待するものは何でも、あなたはそれを期待するのは間違っているでしょう。

于 2012-06-21T05:51:32.573 に答える