2013-02-21 98 views
11

我正在寫一些C++代碼,我想調用兩個函數(checkXDirtycheckYDirty),並且返回true,如果返回true。我需要評估這兩種即使一個返回true,所以我首先想到的是用是(bool | bool)安全嗎?

return checkXDirty() | checkYDirty(); 

這看起來有點怪異(髒,也許)。這總是會在C++中產生正確的結果嗎?怎麼樣C,與_Bool類型? (這段代碼最終可能適用於任何一種語言,並且當我移植代碼時,我不希望出現令人不快的意外)。

+3

Okey,okey。那麼,我會說這是一個非常糟糕的主意,讓'isSomething()'函數帶有副作用。 – Andrey 2013-02-21 00:32:24

+0

@Andrey:好點。我將把函數重命名爲「check ...」。 – nneonneo 2013-02-21 00:33:24

+2

@MitchWheat它們具有按位或正好以避免短路評估。 – juanchopanza 2013-02-21 00:33:38

回答

46

我需要評估這兩種即使一個返回true,所以我首先想到的是用...

然後停止嘗試是棘手的,使你的代碼適合作爲幾行可能。只需調用這兩個函數,使之明顯,他們需要被調用:

const bool x_dirty = is_x_dirty(); 
const bool y_dirty = is_y_dirty(); 
return x_dirty || y_dirty; 

接下來,重命名或掰開你的功能is_xxx_dirty真的不應該產生的副作用。您的代碼難以維護,因此

+0

我將它們重命名爲'check *',因爲'* *'具有誤導性。謝謝。 – nneonneo 2013-02-21 00:37:41

+3

@nneonneo:我會說這仍然是誤導。我不希望這些功能中的任何一個產生副作用。 – 2013-02-21 00:38:13

+4

+1我曾經用'|'試過同樣的黑客攻擊,忘記了評估順序與我的代碼無關。 – 2013-02-21 00:38:21

8

只要這些值不是不確定的,使用按位運算符在技術上就沒問題。但是,由於編碼習慣存在問題,所以我只需編寫一個內聯的OR函數,然後讓編譯器進行優化。編譯器擅長優化,所以,讓它。

return eitherOrBothTrue(checkXDirty(), checkYDirty()); 

或許,如果你夠大膽,敢於承擔解釋那些誰將會保持它的代碼的挑戰,

return !bothFalse(checkXDirty(), checkYDirty()); 

還是現在,我讀@EdS的回答,也許同樣好,只是將值存儲在變量中,但是然後添加const,如下所示:

bool const xIsDirty = checkXDirty(); 
bool const yIsDirty = checkYDirty(); 
return xIsDirty || yIsDirty;