为什么要用两个'!'运算符的布尔值?

时间:2012-12-12 08:38:21

标签: c++ boolean

  

可能重复:
  Double Negation in C++ code

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

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

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

5 个答案:

答案 0 :(得分:14)

将任何内容转换为10是一种C ++技巧。

例如,42逻辑上为true,但不是1,因此对其应用!!,您将其转换为1

答案 1 :(得分:5)

这意味着将值强制为布尔值。因此,如果值正在评估某些东西,那么你就会变成现实。

答案 2 :(得分:4)

强制真值恰好为1。

在布尔上下文(if (x)while (x)x ? a : bfor (; x; ))中,0的值表示false,而任何其他值表示真。

如果你的函数接受了一个真值,但你在那里只需要1,那么!!就可以了。

换句话说,!!xx ? 1 : 0相同。

答案 3 :(得分:1)

最常见的连续拼写检查已启用类型为bool。 BOOL定义为int,所以:

continuousSpellCheckingEnabled = enabled;

发出警告,同时:

continuousSpellCheckingEnabled = !!enabled;

没有。

答案 4 :(得分:1)

  

为什么他们不直接使用“启用”

双重否定仅取消布尔值(0和1),因此对于非布尔值!!(0) == 0,该值将转换为布尔值!!(100) == 1