【问题标题】:C++ Short Circuit EvaluationC++ 短路评估
【发布时间】:2012-02-10 09:57:55
【问题描述】:

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

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

}

var1 是一个空指针,但 Var1->Dosomething() 仍在被调用。我的理解是 && 和 || C++ 中的运算符是短路的,所以如果 var1 为空,那么它将在一开始就终止。还是我还缺少其他东西?

【问题讨论】:

  • 如有疑问,括号

标签: c++ short-circuiting


【解决方案1】:

Operator precedence 是这里的关键。因为&& 的优先级高于||,所以你的表达式等价于

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

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

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

【讨论】:

    【解决方案2】:

    由于&& 的优先级高于||,因此您的表达式被解析为(var1 && bool1) || (bool2 && var1->DoSomething())。现在由于var1 是一个空指针,短路评估意味着bool1 未被评估,|| 的左侧评估为假。因此,要找出表达式的值,必须计算右侧的值(即短路计算在这里起作用!)。 || 的右侧是 bool2 && var1->DoSomething(),因此如果 bool2 为真,则将评估 var1->DoSomething()。另请注意,即使var1 非空,e 表达式的结果也不总是您可能预期的那样。

    【讨论】:

      【解决方案3】:

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

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

      试试

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

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

      在此处查找优先级列表:http://en.cppreference.com/w/cpp/language/operator_precedence 或使用 google。

      【讨论】:

        猜你喜欢
        • 2021-11-21
        • 2017-09-10
        • 1970-01-01
        • 1970-01-01
        • 2015-11-14
        • 2017-01-21
        • 2010-12-21
        • 1970-01-01
        相关资源
        最近更新 更多