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:
比较指针和对象的定义如下:
如果两个指针指向同一数组的不同元素或其子对象,则指向下标高的元素的指针相对较大。
如果一个指针指向数组的元素或其子对象,而另一个指针指向数组最后一个元素的后一位置,则后一个指针比较大。
如果两个指针递归地指向同一对象的不同非静态数据成员,或者指向此类成员的子对象,则如果两个成员具有相同的访问控制并且它们的类不是联合,则指向后声明成员的指针比较大。
如果两个操作数
p
和q
比较相等(5.10),p<=q
和p>=q
都产生true
,p<q
和p>q
都产生假。否则,如果指针p
大于指针q
,则p>=q
,p>q
,q<=p
,q<p
均为true
,p<=q
,p<q
,q>=p
,q>p
均为false
。否则,每个操作符的结果都未指定。