【问题标题】:When to use the double logical not (!!) in C? [duplicate]何时在 C 中使用双逻辑非 (!!)? [复制]
【发布时间】:2014-03-06 20:16:47
【问题描述】:

在 C 中两次否定的有效用途是什么?例如,类似:

if (!!my_cond) {

}

据我了解,!! 将保证 !!my_cond 如果 my_condfalse 则为 0,否则为 1。你什么时候需要使用这个?

【问题讨论】:

  • 我明白它的作用,我只是想弄清楚为什么人们想要“将非零值转换为 1”。我确定有有效的用途,我只是在问其中一些情况是什么。
  • @BlackJack:将其用作二元素数组、标志或位数组中的数组索引,如:array[!!x]flags |= !!x << 4bits[pos/8] |= !!x << pos%8...

标签: c logical-operators


【解决方案1】:

在您显示它的上下文中,它是无用的,因为值本身会评估为 01

它在不会进行这种“布尔”转换的上下文中很有用,例如算术或索引

size_t zerovalues[2] = { 0, 0, };

for (size_t i = 0; i < N; ++i)
    ++zerovalues[!!A[i]];

最后,zerovalues[0] 中的 A 的值 0 的数量以及不在 zerovalues[1] 中的值的数量

【讨论】:

    【解决方案2】:

    我相信这是用来告诉编译器将被测试的变量视为 bool 类型

    【讨论】:

      【解决方案3】:

      它可用于将某物转换为布尔表达式。

      如果foo = !!foo 不为零,则为foo 1,如果已经为零,则将其保留为0。

      您的问题已在此处得到解答: Confused by use of double logical not (!!) operator

      【讨论】:

      • 我认为该链接并没有真正给出可能的用例的答案。
      【解决方案4】:

      双重否定可以用于将逻辑表达式转换为 0 或 1,以便可以将它们与其他逻辑表达式进行比较。

      int x = 63;
      printf("Output: %d  %d  %d\n", x, !x, !!x);
      

      输出:63 0 1

      这允许一些逻辑布尔比较,否则会失败。

      【讨论】:

      • C 从 C99 开始就有 bool 类型。
      【解决方案5】:

      这不是一个好的用例,但你可能会遇到与使用这种反模式的代码的接口,这并非不可想象:

      if (x == TRUE) ...
      

      更一般地说,如果您要实现的 API 记录为在失败时特别返回 0,在成功时特别返回 1,这可能是清理最终返回值的最简单方法。

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 2015-05-03
        • 1970-01-01
        • 2013-09-20
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多