true / false(布尔常量)
C 语言的布尔类型是 _Bool(C99 引入)。在大多数代码中,推荐通过头文件 <stdbool.h> 使用更易读的别名:
bool:_Bool的宏别名(C99 起);true、false:布尔常量宏(C99 起)。
在 C23 中,bool / true / false 也被引入为关键字(并保留 _Bool 作为兼容拼写)。
1. 示例
c
#include <stdbool.h>
#include <stdio.h>
int main(void) {
bool ok = true;
bool bad = false;
printf("%d %d\n", ok, bad);
return 0;
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
可能的输出(示例):
bash
<输出与输入或平台相关,请以实际运行为准>
2. 条件表达式中的“真/假”
在 if、while 等语境中,条件表达式会被当作“与 0 比较”的结果:
- 结果为 0:假;
- 结果非 0:真。
因此,下列写法在语义上等价:
c
if (x) { /* ... */ }
if (x != 0) { /* ... */ }1
2
2
3. _Bool 的归一化语义
把算术表达式赋给 _Bool(或 bool)时,结果会被归一化为 0 或 1。这也是为什么布尔对象做输出时经常只会看到 0 / 1。
c
#include <stdbool.h>
#include <stdio.h>
int main(void) {
bool a = 0;
bool b = 7;
bool c = -3;
printf("%d %d %d\n", a, b, c); /* 0 1 1 */
return 0;
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
可能的输出(示例):
bash
<输出与输入或平台相关,请以实际运行为准>
4. 兼容性提示
如果目标同时覆盖 C11/C17/C23,包含 <stdbool.h> 仍然是最稳妥的统一写法;这样既能在旧标准下获得 bool/true/false,也能在新标准下保持源码风格一致。
5. 布尔语义与位语义要分开
bool 表达的是逻辑真值,不适合直接承载位掩码语义。若代码需要组合多个标志位,应使用无符号整数对象并通过位运算处理;若只表示“成立/不成立”,使用 bool 更清晰。把这两类语义分离后,接口含义会稳定很多。
6. 与库接口交互时的转换
不少旧接口仍使用 int 表示真假。与这类接口交互时,可以在边界上做一次显式转换,让内部逻辑保持 bool 风格,接口处再适配为 0/1 或“零/非零”约定。这样可以避免真假语义在模块内部被反复稀释。
7. 习题
#10417
⚡3⏳2
写出能判断 int x 是否为偶数的布尔表达式:当 x 为偶数时结果为 true,否则为 false。要求对 0、1、2、-3 等若干输入分别给出该表达式的求值结果。