C++ C++;if语句:第一个条件取代第二个条件-UB或定义良好?

C++ C++;if语句:第一个条件取代第二个条件-UB或定义良好?,c++,if-statement,c++14,C++,If Statement,C++14,作为一名中等时间编码员,我多次看到以下情况: if(a!=nullptr&&a->data!=nullptr){ //使用a和a->data做些好事 } 然而,我从未真正提到过关于这样一个简单案例的文档 在我看来,以下情况正在发生: 首先,a!=已选中空PTR 第二,a->data!=已选中空PTR 现在的问题是:如果a!=nullptr返回false,我们通过和&进行连接,然后没有点检查第二条语句a->data!=nullptr为真或假: 由于第一条语句导致一个假表达式,if语句中的代

作为一名中等时间编码员,我多次看到以下情况:

if(a!=nullptr&&a->data!=nullptr){
//使用a和a->data做些好事
}
然而,我从未真正提到过关于这样一个简单案例的文档


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

  • 首先,
    a!=已选中空PTR
  • 第二,
    a->data!=已选中空PTR
现在的问题是:如果
a!=nullptr
返回false,我们通过
和&
进行连接,然后没有点检查第二条语句
a->data!=nullptr
为真或假:

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


但最近我再次回到这个问题:

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

*-不涉及多线程


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

这是安全的

这实际上是少数几个C++保证评价顺序的例子之一。首先计算左侧,然后(仅当左侧为真时)计算第二侧。

这是安全的


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

完全精细,完全定义的短路评估用谷歌。完全精细,完全定义的短路评估用谷歌。更重要的是,它严格按照,因此不总是从左到右进行评估<代码>a+b*c是右(
b*c
),然后是左(
a+…
)。用一个
&&
从左到右进行短路求值。@tadman:你把求值顺序和优先级搞混了。。。例如,在
a()+b()*c()
中,编译器甚至可以自由地生成代码,首先调用
b()
,然后调用
a()
,然后调用
c()
,最后将计算结果。这是一个很好的观点,但这只是因为
+
*
不会短路。我试图考虑一个例子,其中代码“> & & /代码>是因为优先级问题而不是严格的左到右。@ TADMAN:<代码> & & <代码>,<代码> > <代码>和三元运算符<代码>:<代码> > C++中唯一保证评估顺序(只有当不重载)的代码。后来,C++17添加了一些其他的,例如
,因为
std::cout很棒的例子对人们来说是非常令人惊讶的!更重要的是,它的评估严格按照,所以它并不总是从左到右<代码>a+b*c
是右(
b*c
),然后是左(
a+…
)。用一个
&&
从左到右进行短路求值。@tadman:你把求值顺序和优先级搞混了。。。例如,在
a()+b()*c()
中,编译器甚至可以自由地生成代码,首先调用
b()
,然后调用
a()
,然后调用
c()
,最后将计算结果。这是一个很好的观点,但这只是因为
+
*
不会短路。我试图考虑一个例子,其中代码“> & & /代码>是因为优先级问题而不是严格的左到右。@ TADMAN:<代码> & & <代码>,<代码> > <代码>和三元运算符<代码>:<代码> > C++中唯一保证评估顺序(只有当不重载)的代码。后来,C++17添加了一些其他的,例如
,因为
std::cout很棒的例子对人们来说是非常令人惊讶的!