是c++中指针比较未定义或未指定的行为
Is pointer comparison undefined or unspecified behavior in C++?
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
。否则,每个操作符的结果都未指定。
- 从 XML 中读取未指定结构的每个数据成员
- G++ 编译器未为未定义的方法生成错误/警告
- 用数据填充未指定大小的数组
- 访问从联合与另一个成员集复制的联合中的一个成员是否未定义或未指定?
- std::begin-类型特征中未考虑用户定义的重载
- 双循环变量的相等条件:未指定还是未定义
- SQL Server-未找到数据源名称,也未指定默认驱动程序
- 无法创建长度未指定
- 具有未声明/未定义类型的 typedef 结构
- 在Visual Studio中更新Qt翻译(.ts文件)时出现未指定错误
- 未定义与未指定与实现定义的行为
- C++后缀表达式未定义与未指定行为
- 这是未指定(未定义的)行为
- 为什么a=i+i++是未定义的,而不是未指定的行为
- 当 f & g 修改相同的全局变量时,表达式 f() 的值是否> g() 未定义或未指定?
- 在同一语句中调用的执行 IO 的函数:未定义或未指定
- 将参数定义为未指定的模板类型
- 定义未指定名称空间的函数指针
- 是c++中指针比较未定义或未指定的行为
- 此代码是否产生未定义的行为,或者它只是未指定的行为