2017-01-31 24 views
1

標準によると、次の2つの式は未定義の動作ですか?[] - 演算子の加算とインクリメント式

int a = 1, b = 1; 
int c[] = { 1, 2, 3, 4, 5 }; 

// Do the following expressions lead to Undefined Behavior ? 
c[a++]; // (1) 
c[a+b]; // (2) 
+3

'a'は配列ではありません.... –

+0

' a [a ++];はコンパイラエラーです – NathanOliver

+0

'int c [] = {1,2,3,4,5};'を意味しましたか? –

答えて

5

いいえ、現在の形式では、未定義の動作にはなりません。 が恐れているため、シーケンスポイント違反はありません。 c[a++];の場合

  • aの既存の値は、インデックス作成に使用され、そしてaは(ポストインクリメント演算子の)副作用としてインクリメントされます。
  • c[a+b];は変更されていません。およびa+bは、配列の有効なインデックスです。
+0

混乱を招くC++ 14 iso標準セクション '1.9.15'の例があります:http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2014/n4296.pdf 私はこのセクションを誤解するかもしれません。 – SebNag

+0

@SebNagこの例では 'v [i ++]'の結果を使って 'i'を変更しています。これは' i'の2つの順序付けられていない変更をもたらします。 Btw、C++ 14の標準はN4141(+ - いくつかのタイプミス/レイアウトの修正かもしれません)。 N4296は中間草案です。 –

+0

@SebNagこれは別のケースです。そこでは、 'i' __asでポストインクリメントを使用しています。これは' RHS値を 'i'に戻します。さて、副作用の実行と課題の間にシーケンスポイントはありません。どこに問題があるのでしょうか。 –

1

AまたはBまたはaとbの合計は、配列のサイズよりも大きい場合は、未定義の動作を得ることができます:あなたは理由c[a + b] = c[3]たUBがないと見ることができるように

int a = 1, b = 1; 
int c[] = { 1, 2, 3, 4, 5 }; 

c[a++]; // (1) a = 2 
c[a+b]; // (2) a + b = 3 

cout << c[a] << endl; // 3 
cout << c[a+b] << endl; // 4 
cout << a << ", " << b << endl; 

配列の要素です。

関連する問題