2015-07-21 61 views
-5

下面是一些代码来检查值的范围内短路评估一种语言漏洞?

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

这基本上是一个布尔和条件,如果两个操作数为真,则符合条件的结果是真介于英寸 但是,对于短路评估,C++只能测试第一个条件是否为真,如果是,则不检查第二个条件是否为真。 在适当的数学意义上,这是一个布尔测试?这完全deranges我的代码的逻辑,而是我不得不写这样的:

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

什么是短路评价的意义,以及如何才能让C++做一个适当的布尔测试,而无需使用嵌套if条件。

+2

如果是星期二,并且她正在拜访她的父母,那么你就会欺骗你的妻子。你每个星期二都在欺骗她吗? –

+2

有人需要审查他们的[德摩根法律](https://en.wikipedia.org/wiki/De_Morgan%27s_laws) – CoryKramer

+0

你有第二种情况的错字 - 应该是我+ m – cup

回答

8

但是,短路评估C++只测试第一个条件是否为真,如果是,则不检查第二个条件是否为真。

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

2

只是可以肯定的是,这里没有误解:

(a AND b) 

将是FALSE为b任何值,只要a是FALSE。同样,

(a OR b) 

会为b任何价值是真实的,只要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,你可以放心地使用它们。

1

我觉得你是一个有点混淆短路运营商:)

  • 对于& &,如果左侧表达式为,综合作用的结果是 (从不评估右手表情)。
  • 对于||,如果左侧表达式为为真,则组合结果为为真(右侧表达式从不被评估)。

这主要是重要的,当右手表达具有副作用,如改变的值(或调用具有副作用一些功能),例如:

如果( (ITR < 10)& &(++ ITR < n))的{

//做的东西

}

注意,合并后的条件表达式会增加itr通过1,只有对&&左侧的条件表达式为,因为否则的话,在右侧的条件表达式,即(++itr < n)永远不会被评估。

0

当然可以!

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

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

2

这里的缺陷在于你理解短路规则,而不是规则本身。对于任何有效表达式ab

if (a && b) ... 

将始终评估a。如果a为真,则总是会评估b。短路只发生在afalse ....因为那保证a && bfalse,而不需要评估b