我有几个独立的函数,根据其他条件返回true或false。当它们全部返回true时我想要一个动作发生,但是我想要运行所有函数而不管有多少返回false。如果我只是想检查所有函数是否返回true,我会使用:
if (func1() && func2() && func3() ){
//Some code
}
问题在于,如果其中一个函数返回false,则右边的所有函数都不会执行。我之前没有尝试过的一种方法是在if表达式中使用Bitwise AND Operators(&),它看起来像:
if (func1() & func2() & func3() ){
//Some code
}
我已经对这种方法进行了简单的测试,但它似乎产生了预期的结果,但我找不到其他地方使用的这种方法,我想知道是否有任何理由可以产生意想不到的结果?
还有一个很好的理由不使用这种方法比较函数的结果吗?
答案 0 :(得分:3)
如果他们只是返回布尔值真/假操作,那么它将按预期工作:
if (true & false & true)
只是“假”。
但如果他们转向(比如说)整数,那么你会得到意想不到的结果:
if (10 & 100 & 32)
将是
if (b1010 & b1100100 & b100000)
并评估为假。
答案 1 :(得分:2)
只要函数仅返回true
或false
,使用&
运算符就没有问题。对于那个特定情况(作为操作数的布尔值和作为布尔值计算的整个结果),它与&&
运算符完全相同,只是不进行短路评估。
(如果函数返回数值1
和0
,它也会起作用。这就是在操作之前将true
和false
值转换为的值。 )
答案 2 :(得分:-1)
您可以使用以下内容。
(func1() || func2() || func3()) && otherAction()
它被称为短路。
答案 3 :(得分:-2)
问题在于,如果其中一个函数返回false,则右边的所有函数都不会执行
这不是问题。 if
条件检查true / false,如果使用&&
时传入的值之一是假值,则条件短路并且不会执行其余的语句。
这是&&