c - 了解 boolean 值上的 "not"

标签 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("%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 汇编的时期,其中 not eax, eax 会执行 bit-wise 而不是 eax(相当于 C 中的 eax = ~eax)。

最佳答案

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

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

希望对你有帮助

关于c - 了解 boolean 值上的 "not",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11425477/

相关文章:

c - 每个静态数组成员都初始化了吗?

c - 当我们在 C 中将字符串文字转换为整数时会发生什么?

c++ - 为什么我们需要不同的指针数据类型?

javascript - vuejs 中的 boolean 在服务器上变为 1

java - 使用 Spring 验证 boolean 元素是否已显式定义

c - 如何在 C99 中指定函数/变量的内存位置(快/慢)?

c - Linux 内核中的 task_pt_regs

c++ - 如何在verilog模块上运行SPECfp基准测试?

mysql - 将多个 "attributes"添加到 MySQL 数据库中的身份的最有效方法

iphone - libSystem 库的引用