短路评估是一种语言缺陷吗?

时间:2015-07-21 11:37:51

标签: c++

以下是一些代码,用于检查值是否在范围

之间
 if((i <= n) && ( (i+m) >= n){
   //do something.....
 };

这基本上是一个布尔AND条件,如果两个操作数都为真,那么条件的结果为真。 但是,对于短路评估,C ++只测试第一个条件是否为真,如果是,那么它永远不会检查第二个条件是否为真。 在适当的数学意义上,这是一个布尔测试?这完全扰乱了我的代码的逻辑,而是我必须这样写:

 if( (i <= n){
    if((i+m) >= n){
       //do something......
    }
 }

短路评估的意义是什么,如何在不使用嵌套if条件的情况下使C ++进行适当的布尔测试。

5 个答案:

答案 0 :(得分:8)

  

然而,对于短路评估,C ++只测试第一个条件是否为真,如果是,那么它永远不会检查第二个条件是否为真。

||就是这种情况,但不是&&。如果第一个条件为&&,则false短路。你的两个片段是等价的。

答案 1 :(得分:2)

只是为了确保这里没有误解:

(a AND b)
只要b为FALSE,

对于a的任何值都将为FALSE。类似地,

(a OR b)
只要b为TRUE,

对于a的任何值均为true。

因此,在C ++中,当(a && b)为假时,a会短路(a || b)会在a被短路是真的

条件通常没有副作用。如果他们这样做,你可以“聪明”,并做:

if (a && do_stuff()) {}

而不是

if (a) { do_stuff(); }

或者真的很傻,而且

if (a && do_stuff()) { do_more_stuff(); }

当你真正打算做的时候:

if (do_stuff() && a) { do_more_stuff(); }

这就是为什么通常没有副作用的条件。它们当然是有用的和使用的。而且由于evaluation order and the short-circuiting are part of the standard都可以安全地使用它们。

答案 2 :(得分:2)

这里的缺陷在于你对短路规则的理解,而不是规则本身。对于任何有效的表达式<button class="button" ng-click="upload()">video upload</button> a

b

将始终评估 if (a && b) ... 。如果a为真,则始终会评估a。只有ba ....才会发生短路,因为这样可以保证falsea && b,而无需评估false

答案 3 :(得分:1)

我认为你对短路运营商有点困惑:)

  • 对于&amp;&amp; ,如果左侧表达式为 false ,则合并后的结果为 false (右侧)从不评估边表达式。)
  • 对于 || ,如果左侧表达式为 true ,则合并后的结果为 true (右侧表达式)永远不会被评估。)

当右手表达具有 副作用 时,这一点非常重要,例如更改值(或调用带副作用的某些函数),例如:< / p>

  

if((itr&lt; 10)&amp;&amp;(++ itr&lt; n)){

     

//做东西

     

}

请注意,只有当itr左侧的条件表达式为 true 时,组合条件表达式才会1增加&&,否则,从不评估右侧的条件表达式,即(++itr < n)

答案 4 :(得分:0)

是的当然!

使用布尔AND,如果a为假,且b为真,则(a AND b)为假。同样,如果a为假且b为假,则(a AND b)为假。

如果C ++确定左手操作数为假,则使用AND条件,因此不需要检查第二个操作数,因为整个条件为假。 因此,短路评估的好处。