Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;短路评估_C++_Short Circuiting - Fatal编程技术网

C++ C++;短路评估

C++ C++;短路评估,c++,short-circuiting,C++,Short Circuiting,也许我遗漏了一些非常简单的东西,但是当我取消引用指针时,即使我在表达式的最开始检查点,我也会崩溃 if( var1 && bool1 || bool2 && var1->DoSomething() ) { } var1是空指针,但仍在调用var1->Dosomething()。我的理解是C++中的& &和运算符是短路的,所以如果VAR1是空的,那么它将在一开始就终止。还是我还遗漏了什么?是这里的关键。由于&&的优先级高于|,因此表达式相当

也许我遗漏了一些非常简单的东西,但是当我取消引用指针时,即使我在表达式的最开始检查点,我也会崩溃

if( var1 &&
    bool1 || bool2 &&
    var1->DoSomething() )
{

}
var1是空指针,但仍在调用var1->Dosomething()。我的理解是C++中的& &和运算符是短路的,所以如果VAR1是空的,那么它将在一开始就终止。还是我还遗漏了什么?

是这里的关键。由于
&&
的优先级高于
|
,因此表达式相当于

(var1 && bool1) || (bool2 && var1->DoSomething() )
因此,由于
var1
的计算结果为false,
bool1
不被计算,
(var1&&bool1)
产生false,因此必须计算
(bool2&&var1->DoSomething())
。如果
bool2
恰好为真,那么
var1->DoSomething()
也将被计算,从而导致未定义的行为

只需添加一些括号(用于所需的特定表达式树),就可以了。

简单。 &&具有更高的优先级,因此表达式的内容如下:

if( ( var1 && bool1 ) || ( bool2 && var1->DoSomething()) )
试一试

否则,第一个表达式
car1&&bool1
将失败,并计算第二个表达式。由于bool2返回true,显然,如果bool2为true,指针将被取消引用


请在此处查找PrecenceList:或使用google。

由于
&
的优先级高于
|
,因此表达式被解析为
(var1&&bool1)|(bool2&&var1->DoSomething())
。现在,由于
var1
是一个空指针,短路求值意味着
bool1
不求值,而
|
的左侧求值为false。因此,为了找出表达式的值,必须对右侧进行求值(即短路求值在这里不起作用!)。
|
的右侧是
bool2&&var1->DoSomething()
,因此如果
bool2
为true,则将对
var1->DoSomething()
进行计算。还要注意的是,即使对于
var1
non-null,eexpression的结果也不会总是您可能期望的结果。

如有疑问,请用括号括起来!
if( var1 && ( bool1 || bool2 ) && var1->DoSomething() )