<分区>
作为一个普通的时间码农,我看到过很多次类似这样的事情:
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 的操作系统)的不同,行为是否有任何不同?