C语言逻辑运算符 #
一、逻辑运算符概述 #
1.1 三种逻辑运算符 #
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
| && | 逻辑与 | a && b | 两者都为真 |
| || | 逻辑或 | a || b | 至少一个为真 |
| ! | 逻辑非 | !a | 取反 |
1.2 真值表 #
逻辑与 (&&):
| a | b | a && b |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
逻辑或 (||):
| a | b | a || b |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
逻辑非 (!):
| a | !a |
|---|---|
| 0 | 1 |
| 1 | 0 |
二、逻辑与运算符 #
2.1 基本使用 #
c
#include <stdio.h>
int main() {
int a = 5, b = 10;
if (a > 0 && b > 0) {
printf("a和b都是正数\n");
}
return 0;
}
2.2 多条件组合 #
c
#include <stdio.h>
int main() {
int score = 85;
if (score >= 60 && score < 90) {
printf("成绩良好\n");
}
return 0;
}
2.3 短路求值 #
c
#include <stdio.h>
int main() {
int a = 0;
if (a != 0 && 10 / a > 1) {
printf("不会执行\n");
}
printf("程序正常结束\n");
return 0;
}
如果第一个条件为假,第二个条件不会执行,避免除以零错误。
三、逻辑或运算符 #
3.1 基本使用 #
c
#include <stdio.h>
int main() {
int age = 15;
if (age < 18 || age > 60) {
printf("可以享受优惠\n");
}
return 0;
}
3.2 多条件组合 #
c
#include <stdio.h>
int main() {
char c = 'A';
if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {
printf("%c是元音字母\n", c);
}
return 0;
}
3.3 短路求值 #
c
#include <stdio.h>
int main() {
int a = 1;
if (a == 1 || 10 / 0 > 1) {
printf("执行\n");
}
return 0;
}
如果第一个条件为真,第二个条件不会执行。
四、逻辑非运算符 #
4.1 基本使用 #
c
#include <stdio.h>
int main() {
int a = 0;
if (!a) {
printf("a为假\n");
}
return 0;
}
4.2 取反条件 #
c
#include <stdio.h>
int main() {
int a = 5;
if (!(a > 10)) {
printf("a不大于10\n");
}
return 0;
}
4.3 检查空指针 #
c
#include <stdio.h>
int main() {
int* p = NULL;
if (!p) {
printf("指针为空\n");
}
return 0;
}
五、运算符优先级 #
5.1 优先级顺序 #
text
高 !
&&
低 ||
5.2 示例 #
c
#include <stdio.h>
int main() {
int a = 1, b = 0, c = 1;
printf("!a = %d\n", !a);
printf("a && b = %d\n", a && b);
printf("a || b = %d\n", a || b);
printf("a && b || c = %d\n", a && b || c);
printf("a || b && c = %d\n", a || b && c);
return 0;
}
输出:
text
!a = 0
a && b = 0
a || b = 1
a && b || c = 1
a || b && c = 1
5.3 使用括号 #
c
#include <stdio.h>
int main() {
int a = 1, b = 0, c = 1;
printf("(a || b) && c = %d\n", (a || b) && c);
printf("a || (b && c) = %d\n", a || (b && c));
return 0;
}
六、实际应用 #
6.1 范围判断 #
c
#include <stdio.h>
int main() {
int age = 25;
if (age >= 18 && age <= 60) {
printf("成年工作年龄\n");
}
return 0;
}
6.2 字符分类 #
c
#include <stdio.h>
int main() {
char c = 'A';
if (c >= 'A' && c <= 'Z') {
printf("大写字母\n");
} else if (c >= 'a' && c <= 'z') {
printf("小写字母\n");
} else if (c >= '0' && c <= '9') {
printf("数字\n");
}
return 0;
}
6.3 输入验证 #
c
#include <stdio.h>
int main() {
int month;
printf("请输入月份: ");
scanf("%d", &month);
if (month >= 1 && month <= 12) {
printf("有效月份\n");
} else {
printf("无效月份\n");
}
return 0;
}
6.4 闰年判断 #
c
#include <stdio.h>
int main() {
int year = 2024;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
printf("%d年是闰年\n", year);
} else {
printf("%d年不是闰年\n", year);
}
return 0;
}
七、常见错误 #
7.1 混淆 & 和 && #
c
if (a & b) {
}
if (a && b) {
}
& 是位运算,&& 是逻辑运算。
7.2 连续比较 #
c
if (a < b < c) {
}
应改为:
c
if (a < b && b < c) {
}
7.3 短路副作用 #
c
#include <stdio.h>
int main() {
int i = 0;
if (i++ && i > 0) {
printf("不会执行\n");
}
printf("i = %d\n", i);
return 0;
}
由于短路求值,i++ 会执行,但 i > 0 不会。
八、总结 #
逻辑运算符 #
| 运算符 | 说明 | 短路特性 |
|---|---|---|
| && | 逻辑与 | 第一个为假则不计算第二个 |
| || | 逻辑或 | 第一个为真则不计算第二个 |
| ! | 逻辑非 | 无短路 |
优先级 #
text
! > && > ||
短路求值 #
a && b:a为假时,不计算ba || b:a为真时,不计算b
注意事项 #
- 使用括号明确优先级
- 注意短路求值的副作用
- 区分位运算符和逻辑运算符
下一步,让我们学习位运算符!
最后更新:2026-03-26