【问题标题】:Why use two '!' operators on a boolean value? [duplicate]为什么要使用两个“!”布尔值的运算符? [复制]
【发布时间】:2012-12-12 08:38:20
【问题描述】:

可能重复:
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

【问题讨论】:

  • 这里没有明确提到它,但 BOOL 很可能是某种整数。从SUCCEEDED 判断,我认为是winapi,其中是int

标签: c++ boolean


【解决方案1】:

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

例如,42 逻辑上是true,但不是1,因此将!! 应用于它,您将它变成1

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      它强制一个真值正好是 1。

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

      如果你的函数接受一个真值,但你正好需要 1,!! 就可以了。

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

      【讨论】:

        【解决方案4】:

        continuousSpellCheckingEnabled 很可能是 bool 类型。 BOOL 被定义为 int,所以:

        continuousSpellCheckingEnabled = enabled;
        

        发出警告,同时:

        continuousSpellCheckingEnabled = !!enabled;
        

        没有。

        【讨论】:

        • +1 用于解释为什么可能需要转换为 {0,1}
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-04-12
          • 2023-04-01
          • 1970-01-01
          • 2013-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-01
          相关资源
          最近更新 更多