bool递归函数中的true / false优先级

时间:2012-02-06 07:45:30

标签: c++ recursion boolean

我已经阅读过以前的帖子,我已经学到了一些东西,但想要验证一些循环是如何工作的。在阅读中,我是否正确理解“真实”的优先级高于“虚假”?例如:

/.../
return (true || false);

将返回“true”(无论顺序如何)?

如果我有一个布尔递归函数调用它自己的3个变量...我需要的是一个版本返回true以使整个函数返回true,对吗?下面的函数创建它的堆栈帧,然后返回调用创建3个堆栈帧并运行调用,然后如果一个返回true,整个funct返回true,因为true优先于false ...这个假设是否正确?

即:

/* This function is taking a given weight and seeing if it can be offset by available 
 * weights. Depending on what weights are available, the weights can be directly opposed
 * to "weight" (opposite side of scale) or added to... The recursive calls will either all 
 * return false, all return true, or a variation thereof.  All that I can is that if one 
 * branch returns true, the overall function returns true...
*/

bool CanMeasure(int weight, std::vector<int> &availableWeights, int index = 0)
{
    /.../
    // the below can return all true, all false, or some variation thereof...
    return (CanMeasure(weight + availableWeights[index], availableWeights, index + 1) ||
            CanMeasure(weight - availableWeights[index], availableWeights, index + 1) ||
            CanMeasure(weight, availableWeights, index + 1));
}

谢谢你们!

6 个答案:

答案 0 :(得分:6)

truefalse是值,而不是运算符 - 因此它们没有优先权。

但是,如果结果已知,&&||运算符会快速执行评估。因此,如果左手表达式产生true并且您应用||,则不会评估右手表达式;这同样适用于false&&

答案 1 :(得分:4)

return (true || false);不评估错误位的原因是短路布尔评估。见Is Short Circuit Evaluation guaranteed In C++ as it is in Java?。与&amp;&amp;,(false && true)类似,不会评估'true'。

答案 2 :(得分:3)

是(无论订单如何,它都会返回true)。 or中的条件从左到右进行评估,当第一个true偶然发现时,整个条件返回true

在你的例子中:

return (CanMeasure(weight + availableWeights[index], availableWeights, index + 1) ||
        CanMeasure(weight - availableWeights[index], availableWeights, index + 1) ||
        CanMeasure(weight, availableWeights, index + 1));

并非所有条件都必须进行评估。如果第一个评估为true,则其他人将不执行,该函数将返回true

这叫做短路。

让我们来看看一些有问题的代码:

   if ( foo() || goo() )
0041152E  call        foo (41111Dh) 
00411533  movzx       eax,al 
00411536  test        eax,eax 
00411538  jne         wmain+36h (411546h) 
0041153A  call        goo (4111A9h) 
0041153F  movzx       eax,al 
00411542  test        eax,eax 
00411544  je          wmain+49h (411559h) 

在此示例中,foo()goo()都是返回bool的函数。

指令

00411538  jne         wmain+36h (411546h) 

告诉运行时跳出条件,如果foo()求值为true。

此代码未经过优化,因此它不是优化功能。

答案 3 :(得分:3)

||的规则操作:

true || true => true
true || false => true
false || true => true
false || false => false

如果其中一个操作数是真的,无论它的位置如何,结果都是真的。 即使您有类似false || false || false ... false || true的内容,结果也是如此。

答案 4 :(得分:1)

是的,一个返回值,这是真的足以确定结果。 这是通过短路评估来定义的。

http://en.wikipedia.org/wiki/Short-circuit_evaluation

答案 5 :(得分:0)

我不认为这个问题是关于短路评估的。并且“真正具有更高的优先级而不是错误”是没有意义的。 True是一个值,而不是一个操作。

true || false返回true的原因只是逻辑,与编程无关。逻辑运算AND和OR不关心其输入的顺序。他们只关心“有多少是真的”。特别是,如果两个都为真,则AND返回true,而如果至少有一个为真,则OR返回true。

短路评估是另一个主题(虽然可能对您有用但可能仍然有用)。