標準によると、次の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)
標準によると、次の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)
いいえ、現在の形式では、未定義の動作にはなりません。 が恐れているため、シーケンスポイント違反はありません。 c[a++];
の場合
a
の既存の値は、インデックス作成に使用され、そしてa
は(ポストインクリメント演算子の)副作用としてインクリメントされます。c[a+b];
は変更されていません。およびa+b
は、配列の有効なインデックスです。混乱を招くC++ 14 iso標準セクション '1.9.15'の例があります:http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2014/n4296.pdf 私はこのセクションを誤解するかもしれません。 – SebNag
@SebNagこの例では 'v [i ++]'の結果を使って 'i'を変更しています。これは' i'の2つの順序付けられていない変更をもたらします。 Btw、C++ 14の標準はN4141(+ - いくつかのタイプミス/レイアウトの修正かもしれません)。 N4296は中間草案です。 –
@SebNagこれは別のケースです。そこでは、 'i' __asでポストインクリメントを使用しています。これは' RHS値を 'i'に戻します。さて、副作用の実行と課題の間にシーケンスポイントはありません。どこに問題があるのでしょうか。 –
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;
配列の要素です。
'a'は配列ではありません.... –
' a [a ++];はコンパイラエラーです – NathanOliver
'int c [] = {1,2,3,4,5};'を意味しましたか? –