C ++短路评估

时间:2012-01-14 16:08:56

标签: c++ short-circuiting

也许我错过了一些相当简单的东西,但即使我在表达式的最开头检查点,我在取消引用指针时也会崩溃。

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

}

var1是一个空指针,但仍然调用了Var1-> Dosomething()。我的理解是&&和|| C ++中的运算符是短路的,所以如果var1为null,那么它就会在最开始时终止。或者还有其他我想念的东西?

3 个答案:

答案 0 :(得分:12)

Operator precedence是关键。由于&&的优先级高于||,因此您的表达式等同于

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

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

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

答案 1 :(得分:2)

由于&&的优先级高于||,因此您的表达式会被解析为(var1 && bool1) || (bool2 && var1->DoSomething())。现在var1是一个空指针,短路评估意味着bool1未被评估,||的左侧评估为假。因此,为了找出表达式的值,必须评估右侧(即短路评估在这里开始!)。 ||的右侧是bool2 && var1->DoSomething(),因此如果bool2为真,则会var1->DoSomething()进行评估。另请注意,即使var1非空,e表达的结果也不会总是您所期望的。

答案 2 :(得分:1)

简单。 &安培;&安培;具有更高的优先级,因此您的表达式为:

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

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

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

在这里查看优先列表:http://en.cppreference.com/w/cpp/language/operator_precedence或使用谷歌。