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很棒的例子对人们来说是非常令人惊讶的!