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
我明白这是为什么。我的问题是一个<代码>!1equalfalse
?因为在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)