C ++ if语句:第一个条件取代第二个条件-UB还是定义明确?

时间:2019-05-06 19:56:47

标签: 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 ,并且我们通过&&进行了合取,则毫无意义来检查第二个陈述a->data != nullptr是对还是错:

由于第一条语句的结果为错误的表达式,因此if语句中的代码将不会执行,因此我们无需检查第二条表达式


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

拥有这样的结构是否安全:if (a != nullptr && a->data != nullptr) {}?会发生这种情况,以便同时检查两个*语句,并且得到nullptr取消引用吗?

*-不涉及多线程


我要问的是:以上情况是行为是否已明确定义(在哪里可以找到相关文档),还是通常必须避免使用UB?行为是否因操作系统(例如Windows与基于Linux的操作系统)而有所不同?

1 个答案:

答案 0 :(得分:2)

这很安全

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