【问题标题】:Understanding "not" on booleans理解布尔值上的“不”
【发布时间】:2012-07-10 15:32:21
【问题描述】:

我的问题似乎很简单,但我一直对此感到困惑:

bool myBool = TRUE;
if (myBool) printf("1 myBool = true\n");
    else printf("1 myBool = false\n");
myBool = !myBool;
if (myBool) printf("2 myBool = true\n");
    else printf("2 myBool = false\n");

printf("%d\n", TRUE);
printf("%d\n", FALSE);

所有这些输出:

1 myBool = true;
2 myBool = false;
1
0

我明白为什么这是输出。我的问题是!1 怎么能等于false?因为在 C 和 C++ 中,if 检查非零值。我最后一次检查:

TRUE = 0x00000001
FALSE = 0x00000000

因此:

!TRUE = !0x00000001 = 0xfffffffd != 0

编辑:我猜这种困惑源于我学习 x86 程序集的时期,其中 not eax, eax 将在 eax 上执行 bit-wise(相当于 C 中的 eax = ~eax) .

【问题讨论】:

    标签: c boolean c99 boolean-logic


    【解决方案1】:

    为了补充其他答案,规范声明 (C99 §6.5.3.3/5):

    如果其操作数的值比较,逻辑否定运算符!的结果是0 不等于0,如果其操作数的值比较等于0,则1

    结果的类型为int

    表达式!E 等价于(0==E)

    【讨论】:

      【解决方案2】:

      !逻辑 not 运算符,因此任何非零输入都会产生 0 的结果,而 0 输入会产生 1 的结果。

      您正在考虑的结果将是使用按位不,如~true

      【讨论】:

        【解决方案3】:

        您混淆了逻辑非和按位补码。如果输入非零,! 运算符返回 0,否则返回 1。 ~ 运算符翻转输入的位。这意味着!0 = 1!1 = 0,在使用~ 时不是这样。

        另外,请记住if 语句检查值是零还是非零。因此,即使布尔值是 0xFFFFFFFE,它仍然会在 if 语句中计算为 true

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-25
          • 1970-01-01
          • 1970-01-01
          • 2022-12-22
          • 1970-01-01
          相关资源
          最近更新 更多