2

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

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 汇编的时期,在该时期 anot eax, eax会按执行而不是eax(相当于eax = ~eaxC 中的)。

4

3 回答 3

10

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

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

希望这可以帮助

于 2012-07-11T04:20:50.060 回答
5

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

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

结果有类型int

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

于 2012-07-11T04:22:22.883 回答
2

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

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

于 2012-07-11T04:22:00.263 回答