C++ if 语句 : first condition superseding the second - UB or well defined?

标签 c++ if-statement c++14

<分区>

作为一个普通的时间码农,我看到过很多次类似这样的事情:

if (a != nullptr && a->data != nullptr) {
  // do something good with a and a->data
}

但是,我从未真正引用过关于这种简单案例的文档。


在我看来,发生了以下情况:

  • 首先,检查a != nullptr
  • 其次,检查a->data != nullptr

现在的事情是:如果 a != nullptr 返回 false 并且我们通过 && 有一个连词,那么 no point 检查第二个语句 a->data != nullptr 是真还是假:

由于第一个语句导致错误表达式,if 语句中的代码将不会被执行,我们不需要检查第二个表达式


但最近我又回到了这个问题:

如果有这样的构造是否安全:if (a != nullptr && a->data != nullptr) {}?是否可以同时检查两个*语句,而我得到的是 nullptr 取消引用?

*- 不涉及多线程


我要问的是:上述情况是否有明确定义的行为(我在哪里可以找到相关文档)或者这通常是必须避免的 UB?根据操作系统(例如,Windows 与基于 Linux 的操作系统)的不同,行为是否有任何不同?

最佳答案

这是安全的

这实际上是 C++ 保证计算顺序的少数情况之一;首先评估左侧,然后(且仅当左侧为真时)评估第二侧。

关于C++ if 语句 : first condition superseding the second - UB or well defined?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56011599/

相关文章:

c++ - 在功能上输入智能感知?

c++ - 头文件导入行为异常

linux - 为什么在存在目标的情况下,bash 中的否定文件存在检查会返回奇怪的结果?

c - 如果 C 中的语句没有正确评估?

带有 std::enable_if 的 C++ 可变参数模板部分模板特化

c++ - 具有更多模板参数的部分特化

c++ - 有没有办法确定 C++ 编译器实现的语言特性?

c++ - 在基于范围的 for 循环中获取无效引用

c++ - 在 win64 上构建 openssl 失败

c - 替代一大组 if 语句?