对布尔值理解“不”

时间:2012-07-11 04:19:36

标签: c boolean c99 boolean-logic

我的问题看似简单,但我一直对它感到困惑:

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(相当于{{ C)中的1}}。

3 个答案:

答案 0 :(得分:10)

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

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

希望这有帮助

答案 1 :(得分:5)

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

  

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

     

结果的类型为int

     

表达式!E相当于(0==E)

答案 2 :(得分:2)

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

您正在考虑的结果是使用一点点而不是~true