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


短路评估是另一个主题(它可能仍然有助于您避免一些函数调用)。

我认为这个问题与短路评估无关。一