首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果(p > 0) .这是未定义的行为吗?

如果(p > 0) .这是未定义的行为吗?
EN

Stack Overflow用户
提问于 2014-04-21 15:56:36
回答 2查看 3.2K关注 0票数 2

在编译器升级之后,我遇到了一条新的警告消息。

警告:指针与整数零-Wextra的有序比较 如果(inx > 0)

原来inx是一个指针。通常,我希望看到这段旧代码与0或NULL相比较。这让我想到了有符号值和无符号值,以及可能的风险。

一项研究表明:

这些似乎表明,一个地址(由malloc返回)永远不可能为零。

这让我想起了我以前的标准。

4.10指针转换 1空指针常量是整数类型的整数形式的整数值(5.19),等于零或std::nullptr_t类型的prvalue。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且与指向对象的指针的所有其他值或指向函数类型的指针的其他值相区别。这种转换称为空指针转换。相同类型的两个空指针值应比较相等。将空指针常量转换为指针到cv-qualified类型的转换是单个转换,而不是指针转换的顺序,然后是qualifi阳离子转换(4.4)。整数类型的空指针常量可以转换为std::nullptr_t类型的prvalue。

它特别指出,两个空指针比较相等。

考虑到了这一点,这是一小块未定义的代码吗?或者还有另一块我错过的拼图?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-21 16:00:24

它不是未定义的行为,但如果inx不是null,则结果不指定。

C++11 5.9/2:如果相同类型的两个指针p和q指向不同对象,这些对象不是同一个数组的一个或多个元素的成员,或者指向不同的函数,或者(如果其中一个为空),则p<qp>qp<=qp>=q的结果是未指定的

因此,如果inx为null,则可以确保条件代码不会执行,但如果它不是null,则不会执行条件代码。比较应该是inx != 0,它被很好地定义为真当且仅当inx是非空的。

票数 5
EN

Stack Overflow用户

发布于 2014-04-21 16:00:39

您正在查看指针转换,但您应该查看指针比较。

具体而言,比较不引用同一个数组或对象(子对象)的指针。

第5.9节第3和第4款,这一措词载于C++14草案。

将指针与对象进行比较是defined,如下所示:

  • 如果两个指针指向同一数组的diff传入式元素,或指向该数组的次对象,则指向具有较高下标的元素的指针会比较大。
  • 如果一个指针指向数组的一个元素或其子对象,而另一个指针指向数组的最后一个元素,则后者的指针比较大。
  • 如果两个指针指向同一个对象的diff非静态数据成员,或者递归地指向这些成员的子对象,则指向后一个声明成员的指针会比较大,条件是两个成员具有相同的访问控制(第11条),并且它们的类不是一个联合。

如果两个操作数pq比较相等(5.10),则p<=qp>=q都会产生truep<qp>q都会产生false。否则,如果指针p大于指针q,则p>=qp>qq<=pq<p都会产生truep<=qp<qq>=pq>p都会产生false。否则,每个操作符的结果都不指定.

在您的情况下,没有“指针比较大于”关系是定义的,因此运算符根据他们的“否则”行为,提供未指定的结果。这种比较不会直接使程序崩溃,但如果假设if是非空的,则可以通过inx进行任何一个分支。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23200872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档