2014-06-23 42 views
2

我有几个独立的函数,根据其他条件返回true或false。当他们都返回true时,我想要发生一个动作,但是我希望所有的函数都能够运行,而不管有多少个返回false。如果我只是想检查所有的功能都返回true,我会用:如果声明使用按位运算符来强制评估

if (func1() && func2() && func3()){ 
    //Some code 
} 

这样做的问题是,如果功能之一返回false所有功能的权利将不会执行。一种方法我还没有尝试过在if表达式使用按位与运算符(&),它看起来像:

if (func1() & func2() & func3()){ 
    //Some code 
} 

我略略的测试这种方法,它似乎然而,要产生预期的结果我找不到在别处使用的这种方法,我想知道是否有任何理由可能产生意想不到的结果?

也有一个很好的理由不比较使用这种方法的功能的结果?

+1

我最好的猜测是,必须对函数“必须”进行评估,以便进行按位比较,否则当发现错误时会停止更有效的停止。只要您的退货类型在检查中,我并不认为它有问题。 – NickSuperb

+1

就我个人而言,我认为这是一个值得怀疑的设计决定,要依靠这样的副作用。它使代码变得脆弱。 – Pointy

回答

3

的全部目的。如果他们只是返回布尔真/假操作,那么它会按预期工作:

if (true & false & true) 

,简直是“假的”。

但如果他们转向(说)整数,那么你会得到意想不到的结果:

if (10 & 100 & 32) 

if (b1010 & b1100100 & b100000) 

和评估为false。

+0

会不会正确使用'!!'修复整数大小写? – Paul

-2

这样做的问题是,如果功能之一返回false所有功能的权利将不会执行

这是没有问题的。 if条件检查真/假,如果在使用&&时传入的值中的一个是假值,则条件短路并且不会执行该语句的其余部分。

这是&&

+0

我知道这就是&&是要做的。但是在我的脚本中,我不想要这种行为。这就是我所说的一个问题。 – Oracle

+0

@Oracle我正在回答你询问的部分 >还有一个很好的理由不比较使用此方法的函数的结果吗? – edhedges

2

只要函数只返回truefalse,使用&运算符就没有问题。对于这种特定情况(布尔值作为操作数,整个结果评估为布尔值),其工作原理与&&运算符完全相同,除非不进行短路评估。

(这也将。工作,如果函数返回的数值10这正是truefalse值在操作之前转换为。)

-1

您可以使用以下。

(func1() || func2() || func3()) && otherAction() 

它被称为短路。