2012-12-12 11 views
12

可能性の重複:私はWebkitのソースコードをスキャンし
Double Negation in C++ codeなぜ2つの '!'ブール値の演算子?

が、私はブールの奇妙な使用を発見した "ない" 演算子!

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

1または0に何かを変換するのはC++のトリックです。

例えば、42は論理的にtrueですが、あなたが1にそれを回し、それに!!を適用し、1ではありません。

4

それは丁度1

ブール文脈において(if (x)while (x)x ? a : bfor (; x;))と真の値を強制的に他の値がtrue意味し、0値は、偽を意味します。

あなたの関数が真理値を受け入れるが、正確に1が必要な場合は、!!は問題ありません。

つまり、!!xx ? 1 : 0と同じです。

関連する問題