私は、これらのコード行がCおよびC++で未定義の動作を生成する可能性があるかどうかを自問していました。私は、標準が配列の添え字について述べていることを読んで、各ポイントに答えようとしました(C 6.5.6-8)。段落がかなり長いので、段落全体を投稿しませんでした。
さらに、式
P
が配列オブジェクトの最後の要素を指している場合、式は配列オブジェクトの最後の要素の1つ先を指し、式が配列オブジェクトの最後の要素の1つ先を指し(P)+1
ている場合、式は最後の要素を指します。配列オブジェクトの。ポインタオペランドと結果の両方が同じ配列オブジェクトの要素を指している場合、または配列オブジェクトの最後の要素を1つ過ぎている場合、評価によってオーバーフローが発生することはありません。それ以外の場合、動作は定義されていません。結果が配列オブジェクトの最後の要素の1つ先を指している場合、評価される単項演算子のオペランドとして使用されないものとします。Q
(Q)-1
*
1 int a[10];
2 int b = a[9]; // ok
3 int c = a[10]; // UB
4 int* d = (a + 10); // ok
5 int* e = &a[10]; // ok from C99 (& and [] are ignored, pointer is not deferenced), // UB in pre C99
6 int* f = &a[11]; // ok from C99, UB in pre c99
int* g = a;
7 int* h = g + 15; // ok
同じ答えがC++にも当てはまるはずだと思います
これらの行はCおよびC++で有効ですか、標準を誤解しましたか?