2014-06-23 85 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() 

它被稱爲短路。