以下是一些代码,用于检查值是否在范围
之间 if((i <= n) && ( (i+m) >= n){
//do something.....
};
这基本上是一个布尔AND条件,如果两个操作数都为真,那么条件的结果为真。 但是,对于短路评估,C ++只测试第一个条件是否为真,如果是,那么它永远不会检查第二个条件是否为真。 在适当的数学意义上,这是一个布尔测试?这完全扰乱了我的代码的逻辑,而是我必须这样写:
if( (i <= n){
if((i+m) >= n){
//do something......
}
}
短路评估的意义是什么,如何在不使用嵌套if条件的情况下使C ++进行适当的布尔测试。
答案 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
。只有b
为a
....才会发生短路,因为这样可以保证false
为a && b
,而无需评估false
。
答案 3 :(得分:1)
我认为你对短路运营商有点困惑:)
当右手表达具有 副作用 时,这一点非常重要,例如更改值(或调用带副作用的某些函数),例如:< / 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条件,因此不需要检查第二个操作数,因为整个条件为假。 因此,短路评估的好处。