2012-12-12 78 views
12

可能重複:
Double Negation in C++ code爲什麼要用兩個'!'一個布爾值的運算符?

當我掃描了Webkit的源代碼,我發現一個奇怪的使用布爾 「非」 運算符!

BOOL enabled; 
if (SUCCEEDED(sharedPreferences->continuousSpellCheckingEnabled(&enabled))) 
    continuousSpellCheckingEnabled = !!enabled; 
if (SUCCEEDED(sharedPreferences->grammarCheckingEnabled(&enabled))) 
    grammarCheckingEnabled = !!enabled; 

爲什麼他們不是直接用enabled而是用!!enabled

+1

這裏沒有提到它,但'BOOL'很可能是某種類型的整數。用'SUCCEEDED'來判斷,我認爲winapi是'int'。 – chris

回答

5

它的意思是強制一個值爲布爾值。所以如果價值評估的東西,你會得到真實的。

1

最有可能continuousSpellCheckingEnabled是bool類型。 BOOL被定義爲int,所以:

continuousSpellCheckingEnabled = enabled; 

發出警告,同時:

continuousSpellCheckingEnabled = !!enabled; 

沒有。

+0

+1解釋*爲什麼*可能需要轉換爲{0,1} – OrangeDog

1

他們爲什麼不直接使用「已啓用」

否定之否定只取消了對布爾值(0和1),因此!!(0) == 0非布爾值的值將被轉換爲布爾!!(100) == 1

14

這是一個C++技巧,將任何東西都轉換爲10

例如,42在邏輯上是true,而不是1,因此應用!!它,你把它變成1

4

它迫使一個真值,以恰好1.

在布爾上下文(if (x)while (x)x ? a : bfor (; x;)),這是指0假的值,而任何其它值意味着真。

如果你的函數接受一個真值,但你只需要1個,那麼!!就可以。

換句話說,!!xx ? 1 : 0相同。