指针比较是否在C ++中未定义或未指定的行为?

时间:2015-08-02 17:37:27

标签: c++ pointers undefined-behavior unspecified-behavior

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

  

仅当两个指针都指向时才定义指针的减法   同一个数组的元素(尽管语言没有快速的方法)   确保是这样的)。从另一个指针中减去一个指针时,   结果是两个指针之间的数组元素的数量   (整数)。可以将一个整数添加到指针或减去一个   指针的整数;在这两种情况下,结果都是指针值。   如果该值未指向与该数组相同的元素   原始指针或超出一个,使用该值的结果是   未定义。

例如:

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

我正在维基百科上阅读unspecified behavior。它说

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

示例:

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

所以,我很困惑。哪一个是正确的?维基百科或Stroustrup的书? C ++标准对此有何看法?

纠正我如果我误解了某些事情。

1 个答案:

答案 0 :(得分:11)

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

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

  

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

C ++ 14 5.9 / 3-4:

  

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

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

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

  •   
  • 如果两个指针指向同一对象的不同非静态数据成员,或者指向这些成员的子对象,则递归地指向稍后声明的成员的指针比较更大,前提是两个成员具有相同的访问控制,如果他们的班级不是工会。

  •   
     

如果两个操作数pq比较相等(5.10),p<=qp>=q都会产生truep<q以及{{ 1}}两者都产生错误。否则,如果指针p>q的比较大于指针p,则qp>=qp>qq<=p都会产生{{1} }},q<ptruep<=qp<q都会产生q>=p。否则,未指定每个运算符的结果。

相关问题