Col*_*son 2 c boolean-logic boolean c99
我的问题似乎很简单,但我一直对它感到困惑:
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);
Run Code Online (Sandbox Code Playgroud)
所有这些产出:
1 myBool = true;
2 myBool = false;
1
0
Run Code Online (Sandbox Code Playgroud)
我理解为什么这是输出.我的问题是如何才能!1平等false?因为在C和C++中,if检查非零值.我最后一次检查:
TRUE = 0x00000001
FALSE = 0x00000000
Run Code Online (Sandbox Code Playgroud)
因此:
!TRUE = !0x00000001 = 0xfffffffd != 0
Run Code Online (Sandbox Code Playgroud)
编辑:我想这种混乱从我的学习x86汇编,其中一期朵朵not eax, eax将进行逐位不是eax(等效eax = ~eax于C).
tem*_*def 10
你混淆逻辑NOT和按位补码.的!操作者如果输入是非零的且否则为1返回0.的~操作者翻转输入的比特.这意味着,!0 = 1并且!1 = 0,使用时不是这样~.
另外,请记住if语句检查值是零还是非零.因此,即使布尔值为0xFFFFFFFE,它仍然会true在if语句中求值.
希望这可以帮助
为了补充其他答案,规范说明(C99§6.5.3.3/ 5):
逻辑否定运算符的结果
!是,0如果其操作数的值比较等于0,1则其操作数的值不等于0.结果有类型
int.表达式
!E相当于(0==E).