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

true/false precedence in bool recursive function

本文关键字:false 优先级 true 递归函数 bool      更新时间:2023-10-16

我已经阅读了以前的文章,学到了一些东西,但我想验证一些循环是如何工作的。在阅读中,我是否正确地理解了"真"比"假"更重要?例如:

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

是否会返回"true"(无论顺序如何)?

如果我有一个布尔递归函数,它调用自己的3个变体。。。我只需要一个版本返回true,整个函数返回true,对吗?下面的函数创建它的堆栈帧,然后返回调用再创建3个堆栈帧并贯穿调用,然后如果其中一个返回true,则整个函数返回true,因为true优先于false。。。这个假设正确吗?

Ie:

/* 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));
}

谢谢大家!

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

然而,如果结果已知,则&&||运算符确实缩短了评估;因此,如果左手表达式产生true,并且应用||,则不会对右手表达式求值;这同样适用于CCD_ 7和CCD_。

return (true || false);不计算错误位的原因是短路布尔值计算。请参阅短路评估在C++中是否像在Java中一样有保证?。与&amp;,(false && true)不会计算为"true"。

是(无论顺序如何,都会返回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()都是返回布尔的函数。

指令

00411538  jne         wmain+36h (411546h) 

如果foo()评估为真,则告诉运行时跳出条件。

此代码未进行优化,因此它不是优化功能。

||操作规则:
true || true => true
true || false => true
false || true => true
false || false => false

如果其中一个操作数为true,则无论其位置如何,结果都将为true。即使你有类似false || false || false ... false || true的东西,结果也会是真的。

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

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

我不认为这个问题是关于短路评估的。"真的比假的优先级高"是没有道理的。True是一个值,而不是一个运算。

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

短路评估是另一个主题(不过,它可能对避免某些函数调用仍然有用)。