我已经阅读过以前的帖子,我已经学到了一些东西,但想要验证一些循环是如何工作的。在阅读中,我是否正确理解“真实”的优先级高于“虚假”?例如:
/.../
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));
}
谢谢你们!
答案 0 :(得分:6)
true
和false
是值,而不是运算符 - 因此它们没有优先权。
但是,如果结果已知,&&
和||
运算符会快速执行评估。因此,如果左手表达式产生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)
是的,一个返回值,这是真的足以确定结果。 这是通过短路评估来定义的。
答案 5 :(得分:0)
我不认为这个问题是关于短路评估的。并且“真正具有更高的优先级而不是错误”是没有意义的。 True是一个值,而不是一个操作。
true || false
返回true
的原因只是逻辑,与编程无关。逻辑运算AND和OR不关心其输入的顺序。他们只关心“有多少是真的”。特别是,如果两个都为真,则AND返回true,而如果至少有一个为真,则OR返回true。
短路评估是另一个主题(虽然可能对您有用但可能仍然有用)。