bool递归函数中的true/false优先级
true/false precedence in bool recursive function
我已经阅读了以前的文章,学到了一些东西,但我想验证一些循环是如何工作的。在阅读中,我是否正确地理解了"真"比"假"更重要?例如:
/.../
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));
}
谢谢大家!
true
和false
是值,而不是运算符,因此它们没有优先级。
然而,如果结果已知,则&&
和||
运算符确实缩短了评估;因此,如果左手表达式产生true
,并且应用||
,则不会对右手表达式求值;这同样适用于CCD_ 7和CCD_。
return (true || false);
不计算错误位的原因是短路布尔值计算。请参阅短路评估在C++中是否像在Java中一样有保证?。与&;,(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;而如果至少有一个
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 伪造事实↔false
- QueryWorkingSet总是返回false
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 如何区分地图中的 0 和 false?
- 打印优先级队列
- 带自定义比较器的最小优先级队列
- 优先级队列自定义比较器
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- 排序数组优先级队列
- Arduino-C++ bool 不会从 false 变为 true
- 更改运行时优先级队列的排序功能
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- 优先级队列构造函数的工作
- 实现优先级队列
- 优先级队列功能比较
- bool递归函数中的true/false优先级