C “理解”;不是";论布尔人

C “理解”;不是";论布尔人,c,boolean,c99,boolean-logic,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(

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

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
我明白这是为什么。我的问题是一个<代码>!1equal
false
?因为在C和C++中,如果检查非零值。上次我检查时:

TRUE = 0x00000001
FALSE = 0x00000000
因此:

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


编辑:我猜这种混淆源于我学习x86汇编的那段时间,在那里,
noteax,eax
将在
eax
上执行一点明智的not(相当于C中的
eax=~eax
)。

您混淆了逻辑not和位补。
运算符返回0,否则返回1。
~
运算符翻转输入位。这意味着
!0=1
!1=0,这在使用
~
时不正确

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

希望这有帮助
是一个逻辑
not
运算符,因此任何非零输入都会产生0的结果,而0输入则会产生1的结果


您所想到的结果是使用稍微明智的not,如
~true

来补充其他答案,规范规定(C99§6.5.3.3/5):

逻辑求反运算符的结果
0
不等于
0
1
如果其操作数的值比较等于
0

结果的类型为
int

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