【问题标题】:Is if statement order check fr object depend on compiler? [duplicate]对象的 if 语句顺序检查是否取决于编译器? [复制]
【发布时间】:2017-07-25 21:56:50
【问题描述】:

快速提问。以下代码将如何执行检查顺序:

if ((NULL != ObjectPtr) && (ObjectPtr->isValid()) )
{
}

if-statement 上的顺序是否取决于所使用的编译器?如果ObjectPtrNULL,该代码会崩溃吗?

【问题讨论】:

  • 括号太多。
  • Yoda Conditions 在 20 年前就与 C++ 相关,但现在已经不是这样了。
  • 这是一个明显的重复,来吧 120k 和 200k 用户。
  • @meagar:你不能责怪任何人没有找到这个问题,它的标题是 100% 错误的(现已修复)。

标签: c++ pointers if-statement


【解决方案1】:

顺序是否取决于if 语句取决于使用的编译器?

没有。

如果ObjectPtrNULL,该代码会崩溃吗?

没有。

语言保证。

【讨论】:

    【解决方案2】:

    在 C++ 中,&& 运算符保证是短路。这意味着首先检查左侧操作数,如果为 false,则不计算右侧操作数。

    所以你的代码是安全的,不会通过 NULL 指针执行成员访问。

    同样,|| 也是短路的,如果左操作数为真,则不会计算其任何右操作数。

    对于布尔操作数,按位运算符 &| 与逻辑运算符 &&|| 给出相同的结果,但按位运算符不会短路,并且它们的右手操作数始终为评估(可能在左侧之前)。

    正如 Quentin 在评论中提到的,用户提供的这些运算符的重载不会短路,因为它们实际上是函数调用并且具有函数调用的评估顺序(所有参数在调用之前评估)。

    【讨论】:

    • 注意:这仅适用于内置运算符(可能很明显,也可能不明显)。
    猜你喜欢
    • 2023-02-06
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多