2012-11-27 53 views
1

有一天,一位同事注意到了常見的模式,他這樣做的:單行表達式分支並清除布爾標誌?

if (someBooleanFlag) 
{ 
    someBooleanFlag = FALSE; 
    ...do some more stuff... 
} 

基本上,一個鎖存清除上讀取。並問我是否知道一個聰明的方式來測試國旗並將其清除爲單線,這樣他就可以擺脫樣板someBooleanFlag = FALSE;位。關於這是否是良好的作風還是不偏題,我發現我能爲他做的最好的是一個像

#define TESTANDCLEAR(var) (var ? var-- : 0) 

這使得只有1和0正在使用的假設,而這是行不通的在掩碼上。我想我會轉向Stack的巫師,看看是否有更好的方法和其他技術可以使用。

(同樣,沒有必要討論是否做TESTANDCLEAR()的表達是好還是壞的作風,如果我們真的能做到這一點很多種學術活動,以及如何普遍)

+1

下一個需要閱讀代碼的開發者,哪種方法最清晰,最容易理解? –

回答

4

我不認爲你不需要做出0/1的假設,即使採用了你已有的方法。作業是返回一個值的表達式,所以你可以定義宏爲:

(var ? !(var = false) : false) 

或者,您可以用逗號:

(var ? ((var = false), true) : false) 

,如果你想這一個工作,這將有助於位域測試爲N個位:

(((var & (1 << N)) ? ((var = var & ~(1 << N)), true) : false) 
+0

非常好,謝謝!我實際上不確定我是否曾經在C語言中內化過逗號運算符,但你不會經常看到它。 –

3

醜陋,但我認爲這應該工作:

if (someBooleanFlag && !(someBooleanFlag = !someBooleanFlag)) 

對於上帝的愛,從來沒有在生產代碼中這樣做過。