作为一名适度的时间编码员,我多次看到以下内容:
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的操作系统)而有所不同?
答案 0 :(得分:2)
这很安全
实际上,这是C ++保证评估顺序的少数情况之一;首先评估左侧,然后(且仅当左侧为true时)评估第二侧。