在 C 语言中,关系运算和逻辑运算的结果用两种值表示:真和假。其中,0 表示“假”,非 0 表示“真”。
例如:
#include <stdio.h>
int main() {
int a, b, flag;
scanf("%d %d", &a, &b);
flag = a > b; // flag 保存关系运算结果:0 或非 0
printf("flag = %d\n", flag);
return 0;
}
如果输入 10 20
,程序输出:
flag = 0
虽然我们习惯将结果视作“真”和“假”,但在 C 语言标准(自 C89 起)中,关系表达式和逻辑表达式的求值结果是整型。根据 C99 及以后的标准,表达式的结果会被转换为 0 或 1,表示假和真。
在 C99 及以后版本中,关系和逻辑运算符的结果要么是 0,要么是 1(而非任意非零值)。
#include <stdio.h>
int main() {
printf("%d\n", (5 > 3)); // 打印 1
printf("%d\n", (5 && 2)); // 打印 1,逻辑与
printf("%d\n", (!0)); // 打印 1,逻辑非
printf("%d\n", (5 && 0)); // 打印 0
return 0;
}
为了让代码更具可读性,我们常常希望有真正的布尔类型。在 C++ 中,这一需求得到了满足:
#include <iostream>
using namespace std;
int main() {
int a, b;
bool flag; // 定义布尔变量
cin >> a >> b;
flag = (a > b);
cout << "flag = " << flag << endl;
return 0;
}
输入 10 20
后,输出:
flag = 0
在 C++ 中,bool
类型只有两个取值:
但是,默认情况下,使用 cout
输出 bool
变量时,仍然会以数字 1
或 0
表示。
如果想让 cout
输出 true
/false
字符串,可以引入 std::boolalpha
:
#include <iostream>
using namespace std;
int main() {
bool flag = true;
cout << boolalpha; // 打开布尔值字面输出
cout << flag << endl; // 输出 "true"
flag = false;
cout << flag << endl; // 输出 "false"
return 0;
}
此外,自 C99 标准开始,C 语言也支持真正的布尔类型:
#include <stdbool.h> // 引入 bool、true、false 定义
#include <stdio.h>
int main() {
bool flag = true;
if (flag) {
puts("true");
} else {
puts("false");
}
flag = false;
if (flag) {
puts("true");
} else {
puts("false");
}
return 0;
}
在这段代码中:
stdbool.h
中定义了宏 bool
为 _Bool
,并将 true
、false
分别定义为 1
和 0
。
_Bool
类型是 C 语言原生的布尔类型,大小通常为 1 字节。
建议:在代码中,使用 bool
(或在 C 中引入 stdbool.h
)来表示逻辑或开关变量,能让代码语义更清晰、可维护性更高。
补充说明:
-
逻辑运算符:
&&
(逻辑与),只有两边都为真时结果才为真。
||
(逻辑或),只要有一边为真结果就为真。
!
(逻辑非),将真变为假,将假变为真。
-
短路求值:在 C/C++ 中,&&
和 ||
都具有短路特性,即:
a && b
:如果 a
为假,则不再计算 b
。
a || b
:如果 a
为真,则不再计算 b
。
-
类型转换:
- 在 C 中,任何非零整数值用于逻辑上下文时都被当作真。
- 在 C++ 中,整数到
bool
会被转换:0 为 false
,非 0 为 true
。