对布尔值理解"不"

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语句中求值.

希望这可以帮助


Jam*_*lis 5

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

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

结果有类型int.

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