12

可能重复:
C++ 代码中的双重否定

当我扫描 Webkit 源代码时,我发现布尔“非”运算符的一个奇怪用法!

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

他们为什么不enabled直接使用而不是使用!!enabled

4

5 回答 5

14

1将任何内容转换为或是一个 C++ 技巧0

例如,42逻辑上是true,但不是1,所以应用!!到它,你把它变成1

于 2012-12-12T08:42:29.620 回答
5

这意味着将值强制为布尔值。因此,如果该值正在评估某些东西,那么您将得到正确的结果。

于 2012-12-12T08:39:29.440 回答
4

它强制真值恰好为 1。

在布尔上下文 ( if (x), while (x), x ? a : b, for (; x; )) 中,一个值0表示假,而任何其他值都表示真。

如果你的函数接受一个真值,但你需要正好 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 回答