C++ 布尔递归函数中的真/假优先级
我读了一些以前的文章,学到了一些东西,但我想验证一些循环是如何工作的。在阅读中,我是否正确理解“真”比“假”具有更高的优先级?例如:C++ 布尔递归函数中的真/假优先级,c++,recursion,boolean,C++,Recursion,Boolean,我读了一些以前的文章,学到了一些东西,但我想验证一些循环是如何工作的。在阅读中,我是否正确理解“真”比“假”具有更高的优先级?例如: /.../ return (true || false); 将返回“true”(不考虑顺序) 如果我有一个布尔递归函数,它调用自身的3个变体…我只需要一个版本返回true,整个函数返回true,对吗?下面的函数创建它的堆栈帧,然后返回调用再创建3个堆栈帧并运行调用,如果其中一个返回true,则整个函数返回true,因为true优先于false。。。这个假设正确吗
/.../
return (true || false);
将返回“true”(不考虑顺序)
如果我有一个布尔递归函数,它调用自身的3个变体…我只需要一个版本返回true,整个函数返回true,对吗?下面的函数创建它的堆栈帧,然后返回调用再创建3个堆栈帧并运行调用,如果其中一个返回true,则整个函数返回true,因为true优先于false。。。这个假设正确吗
即:
/*此函数将获取给定的权重,并查看它是否可以由可用的
*重量。根据可用的配重,配重可以直接相对
*到“重量”(天平的另一侧)或添加到。。。递归调用要么全部调用
*返回false、all返回true或其变体。我所能做的就是如果有
*分支返回true,整个函数返回true。。。
*/
布尔CanMeasure(整数权重,标准::向量和可用权重,整数索引=0)
{
/.../
//下面可以返回所有真、假或其某些变化。。。
返回(可测量(权重+可用权重[索引],可用权重,索引+1)||
CanMeasure(权重-可用权重[索引],可用权重,索引+1)||
可测量(重量、可用重量、指数+1);
}
谢谢大家 返回
的原因(true | | false)代码>不计算假位是因为短路布尔计算。看见类似地,&&,(false&&true)
不会计算“true”。返回(true | false)的原因代码>不计算假位是因为短路布尔计算。看见类似地,&&,(false&&true)
不会计算“true”。是(无论顺序如何,它都会返回true
)。或
中的条件从左到右求值,当第一个为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,则通知运行时跳出条件
此代码未优化,因此它不是优化功能。是(无论顺序如何,它都将返回true
)。或
中的条件从左到右求值,当第一个为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,则通知运行时跳出条件
此代码未经优化,因此不是优化功能。操作规则:
true || true => true
true || false => true
false || true => true
false || false => false
如果其中一个操作数为真,则无论其位置如何,结果都为真。
即使你有类似于false | | false | | false的东西。。。false | | true
结果将为true。操作规则:
true || true => true
true || false => true
false || true => true
false || false => false
如果其中一个操作数为真,则无论其位置如何,结果都为真。
即使你有类似于false | | false | | false的东西。。。false | true
结果将为true。true
和false
是值,而不是运算符,因此它们没有优先级
但是,如果结果已知,则&&
和|
运算符会简化计算;因此,如果左手表达式产生true
并应用| |
,则不会计算右手表达式;这同样适用于false
和&&
true
和false
是值,而不是运算符,因此它们没有优先级
但是,如果结果已知,则&&
和|
运算符会简化计算;因此,如果左手表达式产生true
并应用| |
,则不会计算右手表达式;这同样适用于false
和&
是,一个返回值(为true)足以确定结果。
这是由短路评估定义的
是,一个返回值(为true)足以确定结果。
这是由短路评估定义的
我认为这个问题与短路评估无关。“真的比假的优先级高”是没有意义的。True是一个值,而不是一个操作
true | false
返回true
的原因只是逻辑,与编程无关。逻辑运算和或不关心其输入的顺序。他们只关心“有多少是真的”。特别是,如果两者都为true,则返回true;如果至少有一个为true,则返回true
短路评估是另一个主题(它可能仍然有助于您避免一些函数调用)。我认为这个问题与短路评估无关。一