我在问自己这行代码是否会在 C 和 C++ 中产生未定义的行为。我试图回答每个点阅读标准所说的数组下标(C 6.5.6 - 8)。我没有发布整个段落,因为它很长。
此外,如果表达式
P
指向数组对象的最后一个元素,则表达式(P)+1
指向数组对象的最后一个元素,如果表达式Q
指向数组对象的最后一个元素,则表达式(Q)-1
指向最后一个元素数组对象。如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则计算不应产生溢出;否则,行为未定义。如果结果指向数组 >object 的最后一个元素,则不应将其用作计算的一元运算符的操作数*
。
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++ 中是否有效,我是否误解了标准?