12

重複の可能性:
C++ コードでの二重否定

Webkit のソース コードをスキャンしたところ、ブール値の "not" 演算子の奇妙な使い方が見つかりました!

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

enabledの代わりに直接使用しないのはなぜ!!enabledですか?

4

5 に答える 5

14

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

たとえば、42は論理的には ですが、そうtrueではない1ので、それに適用!!すると、 になります1

于 2012-12-12T08:42:29.620 に答える
5

It's meant to force a value to a boolean. So if the value is evaluating to something, you'll get true.

于 2012-12-12T08:39:29.440 に答える
4

真の値が正確に 1 になるように強制します。

ブール コンテキスト ( if (x)while (x)x ? a : bfor (; x; )) では、値0は false を意味し、それ以外の値は true を意味します。

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

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

于 2012-12-12T08:42:44.677 に答える
1

おそらく、continuousSpellCheckingEnabled は bool 型です。BOOL は int として定義されているため、次のようになります。

continuousSpellCheckingEnabled = enabled;

次の場合に警告を発行します。

continuousSpellCheckingEnabled = !!enabled;

ではない。

于 2012-12-12T08:41:49.997 に答える
1

「有効」を直接使用しないのはなぜですか

二重否定はブール値 (0 と 1) に対してのみキャンセルされるため!!(0) == 0、非ブール値の場合、値はブール値に変換されます!!(100) == 1

于 2012-12-12T08:42:15.330 に答える