2011-01-22 13 views
1

§5/ 4 C++標準規格に誤りがありますか?

i = 7, i++, i++; // the behavior is undefined 
i = ++i + 1; //the behavior is undefined 

に変更する必要があります
i = 7, i++, i++; // i becomes 9 
i = ++i + 1; //the behavior is unspecified 

+3

をチェックアウトすることができますなぜあなたは私たちとではないに仕様の執筆者を求めていますか? – BoltClock

+1

[シーケンスポイントエラー:不定または未定義? ](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#351) –

+2

C++標準を引用しているので、実際にはCの質問ではないので、タグを削除しました。 – paxdiablo

答えて

6
i = 7, i++, i++; // i becomes 9 

は完全に問題ありません。オペレータ=,よりも高い優先順位を有するので、式は,シーケンス点があるため、完璧に動作が定義されている

(i = 7), i++, i++; 

と等価です。

限り

として
i = ++i + 1; //the behavior is unspecified 

は行動がundefined in C++03しかしwell defined in C++0xで懸念しています。あなたがC++ 0xのドラフトを持っている場合は、セクション1.9/15

i = i++ + 1; // the behavior is undefined 
4

いいえ、標準は正しいです。 comma operatorは、前のオペランドの副作用が次のオペランドの評価を完了する前に完了することを保証します。

これらの保証は、sequence pointsによって提供され、コンマ演算子(&&および||)も同様です。

2番目のステートメントの文言の変更が正しいことに注意してください。これは未定義ではなく、未定義です。

+0

規格は定義上「正しい」ものですが、この例は非規範的であり、間違っていると認められています。 –

+0

ああ、私は未定義の変更に気付かなかった。ありがとう。 –

+0

奇妙なことに、私はC++標準でシーケンスポイントと呼ばれるとは思わない。彼らは同じコンセプトを持っているので(答えを無効にするわけではありません)、私は彼らの名前を思い出すことができません。 – paxdiablo

7

はい、この欠陥レポート:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#351をご覧ください。

説明:この例は間違っていますが、最初のステートメントでは「修正」が正しくありません。最初のステートメントは、標準で正しくコメントされています。 2番目のコメントだけが間違っています。

+0

これは、シーケンスポイント自体ではなく、「未指定」と「未定義」の表現にのみ影響することに言及する必要があります。これは問題ありません。 –

+0

@ KonradRuddolph:正解、私は私の答えを明確にしました。 –

2

That should be changed to

i = 7, i++, i++; // the behavior is undefined 

なぜですか?標準は正しいですが、これは変更すべきではなく、この動作は明確に定義されています。

コンマ(,)は、実行順序が定義されるように計算にsequence pointを導入しています。

関連する問題