【问题标题】:What does double not (!!) used on a non-boolean variable do? [duplicate]用于非布尔变量的 double not (!!) 有什么作用? [复制]
【发布时间】:2011-07-20 15:10:55
【问题描述】:

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

我正在使用生产代码,我曾多次遇到过这样的语句:

Class.func(!!notABool);

前几次我将其视为programmer quirk (也许是为了强调这是一个条件语句而不是传递给 func 的数字?)但我遇到了几个使用上述语句的语句,现在我我想知道它是否真的有所作为。在大多数情况下,notABool 是一个数字(int、float、double...我已经看到了所有 3 个)我最初的猜测是它类似于打字:

Class.func((bool)notABool);

但我不完全确定?

【问题讨论】:

  • 等待 5...4...3... 中的 Donald Knuth 报价...
  • @jonsca:Doh!搜索除否定之外的所有其他措辞。同意,这是重复的。
  • 不用担心。我认为重复的标题具有误导性,但它出现在“相关”列表中---->
  • 这看起来是一个非常糟糕的做法。

标签: c++ boolean


【解决方案1】:

是的,功能上和(bool) notABool完全一样。

根据定义,在 C++ 语言中,! 的操作数被隐式转换为 bool 类型,因此 !!notABool!! (bool) notABool 完全相同,即与 (bool) notABool 相同。

在 C 语言中,!! 是一种流行的技巧,可以将非 1/0 值“标准化”为 1/0 形式。在 C++ 中,您只需执行 (bool) notABool。或者,如果您愿意,您仍然可以使用!!notABool

【讨论】:

    【解决方案2】:

    对于原始类型,是的,它本质上等同于:

    !(notABool != 0)
    

    这又相当于:

    (bool)notABool
    

    对于非原始类型,这将是编译器错误,除非您重载了operator!,在这种情况下,它可能会做任何事情。

    【讨论】:

      【解决方案3】:

      这是来自 C 的传统习语,意思是“归一化为 0 或 1”。我认为除了习惯之外没有其他理由在 C++ 中使用它。

      【讨论】:

        【解决方案4】:

        它将 BOOL(定义为 int)转换为 c++ bool。 BOOL 是一个定义,在某些情况下为 true 可以包含不同的整数值。因此,例如 BOOL a = (BOOL)1;和布尔 b =(布尔)2;两者都通过检查为真。但是,如果您尝试比较,您会发现 a 不等于 b。但转换后 !!a 等于 !!b。

        (bool)notABoo - 不相似,因为您将转换变量字节的类型仍然会有不同的值。 !!不仅转换类型,而且在某些情况下也转换值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-22
          • 2018-05-21
          • 1970-01-01
          • 2011-04-04
          • 2010-11-20
          • 2023-04-10
          • 2021-09-16
          相关资源
          最近更新 更多