我正在阅读K&R中有关数组算术的部分,发现了一些奇怪的东西。我为了上下文贴出了整个段落,但我主要关注粗体部分:
如果p和q指向同一个数组的成员,则像==、!=、<、>=等关系运算符可以正常工作。例如,如果p指向数组的早期成员,而q指向数组的后期成员,则p < q为真。任何指针都可以与零有意义地进行相等或不相等的比较。但是,对于不指向同一数组成员的指针进行算术或比较的行为是未定义的。(有一个例外:可以在指针算术中使用数组结尾后的第一个元素的地址。)
我在这里得到了一些答案(C pointer arithmetic for arrays),但我对以下内容表示怀疑:
由于以下代码似乎可以在没有抛出任何异常或错误的情况下使用解引用和比较,因此我对此存有疑虑:
如果p和q指向同一个数组的成员,则像==、!=、<、>=等关系运算符可以正常工作。例如,如果p指向数组的早期成员,而q指向数组的后期成员,则p < q为真。任何指针都可以与零有意义地进行相等或不相等的比较。但是,对于不指向同一数组成员的指针进行算术或比较的行为是未定义的。(有一个例外:可以在指针算术中使用数组结尾后的第一个元素的地址。)
我在这里得到了一些答案(C pointer arithmetic for arrays),但我对以下内容表示怀疑:
由于以下代码似乎可以在没有抛出任何异常或错误的情况下使用解引用和比较,因此我对此存有疑虑:
#include <stdio.h>
int main() {
int a[5] = { 1, 2, 3, 4, 5 };
int b[5] = { 1, 2, 3, 4, 5 };
int *p = &a[7];
int *q = &b[3];
printf("%d\n", p);
printf("%d\n", q);
printf("%d\n", q > p); // relational from different arrays
printf("%d", *p); // dereferencing also seems to work
}
有人可以帮忙吗?
代码应该抛出一个错误。