是c++中指针比较未定义或未指定的行为

Is pointer comparison undefined or unspecified behavior in C++?

本文关键字:未指定 未定义 c++ 指针 比较      更新时间:2023-10-16

Stroustrup编写的c++编程语言第3版说,

指针的减法只有在两个指针都指向时才定义元素的相同数组(尽管语言没有快速的方法)确保是这样)。当从一个指针减去另一个指针时,结果是两个指针之间的数组元素数(整数)。可以在指针上加整数,也可以在指针上减整数来自指针的整型;在这两种情况下,结果都是一个指针值。如果该值不指向与对象相同的数组元素初始指针或其后的指针,使用该值的结果为定义。

例如:

void f ()
{
    int v1 [10];
    int v2 [10];
    int i1 = &v1[5] - &v1[3];   // i1 = 2
    int i2 = &v1[5] - &v2[3];   // result undefined
}

我正在维基百科上阅读关于未指定行为的文章。它说

在C和c++中,只有当指针指向同一对象的成员或同一数组的元素时,才严格定义指向对象的指针的比较。

的例子:

int main(void)
{
  int a = 0;
  int b = 0;
  return &a < &b; /* unspecified behavior in C++, undefined in C */
}

所以,我很困惑。哪一个是正确的?维基百科还是斯特劳斯特鲁普的书?c++标准对此有什么规定?

如果我误解了什么,请纠正我。

注意,指针减法和指针比较是不同的操作,规则不同。

c++ 14 5.6/6,关于减指针:

除非两个指针都指向同一个数组对象的元素,或者指向数组对象最后一个元素的后一个,否则该行为是未定义的。

5.9 c++ 14/3 - 4:

比较指针和对象的定义如下:

  • 如果两个指针指向同一数组的不同元素或其子对象,则指向下标高的元素的指针相对较大。

  • 如果一个指针指向数组的元素或其子对象,而另一个指针指向数组最后一个元素的后一位置,则后一个指针比较大。

  • 如果两个指针递归地指向同一对象的不同非静态数据成员,或者指向此类成员的子对象,则如果两个成员具有相同的访问控制并且它们的类不是联合,则指向后声明成员的指针比较大。

如果两个操作数pq比较相等(5.10),p<=qp>=q都产生true, p<qp>q都产生假。否则,如果指针p大于指针q,则p>=q, p>q, q<=p, q<p均为true, p<=q, p<q, q>=p, q>p均为false。否则,每个操作符的结果都未指定。