2012-04-27 25 views
2

次のvalueAとvalueBの初期化では、未定義の動作が発生しますか?初期化の評価順序

int array[2] = {1,2}; 
int index = 0; 
int valueA = array[index++], valueB = array[index++]; 

これにはC++ 98とC++ 11の間に変更がありますか?

+3

なぜあなたはこれを行いますか?キーワードintの入力を1回だけ保存します。 – TemplateRex

+0

既存のコードのバグを発見するのはどうですか?それとも知りたいのですか? – kyku

答えて

5

この動作は明確に定義されています。 n3290§8宣言子ドラフトC++ 11から:それは単独で宣言していたかのように

宣言の各INIT-宣言子は別々に分析されます。

だからあなたのコードは同等です:

... 
int valueA = array[index++]; 
int valueB = array[index++]; 

私はC++ 98標準を持っていないが、同じ文言は、ISO/IEC 14882に存在している:2003( "C++ 03 ")。

+0

しかし、それはコンマで誘導されたシーケンスポイントが必要であるため、2つの初期化の順序を修正しません。 – TemplateRex

+0

宣言自体は完全な表現です。あなたは完全な表現の後にシーケンスポイントを得ます。 – Mat

+0

宣言は式でもありませんが、 'array [index ++]'は完全な式です。 – Cosyn

0

未定義の動作です。 コンマはsequence pointです。

+2

そこにコンマ演算子はありません。 – Mat

+0

はい、値の初期化の直前です – TemplateRex

+2

@rhalbersma:これはカンマ演算子ではありません。 – Mat

関連する問題