C: 条件判断
条件判断就像路口的红绿灯——满足条件走一条路,不满足走另一条路,程序因判断而拥有智慧。
1. if 语句
if 是最基本的条件判断。条件为真(非0)执行大括号内的代码,为假(0)则跳过。
C
#include <stdio.h>
int main(void) {
int score = 95;
if (score >= 90) {
printf("优秀!\n");
}
printf("程序继续执行\n");
return 0;
}
TEXT
📖 仅展示
优秀!
程序继续执行
💡 如果
if 后面只有一条语句,大括号可以省略,但强烈建议始终使用大括号,避免后续添加语句时忘记加括号导致逻辑错误。
2. if-else 语句
if-else 提供两个分支:条件为真执行 if 块,为假执行 else 块,二选一必走其一。
C
#include <stdio.h>
int main(void) {
int age = 16;
if (age >= 18) {
printf("你已成年\n");
} else {
printf("你未成年\n");
}
return 0;
}
TEXT
📖 仅展示
你未成年
(1) 悬空 else 问题
当有多个 if 嵌套时,else 与最近的 if 配对:
C
#include <stdio.h>
int main(void) {
int a = 5, b = 0;
if (a > 10)
if (b > 0)
printf("A\n");
else
printf("B\n");
return 0;
}
这段代码看似 else 和第一个 if 配对,实际上它和第二个 if 配对,所以什么也不输出。加上大括号就清晰了:
C
if (a > 10) {
if (b > 0) {
printf("A\n");
} else {
printf("B\n");
}
}
⚠️ 始终使用大括号可以彻底避免悬空 else 问题。
3. if-else if-else 多分支
当有多个条件需要逐一判断时,使用 else if 串联多个分支:
C
#include <stdio.h>
int main(void) {
int score = 78;
if (score >= 90) {
printf("等级: A\n");
} else if (score >= 80) {
printf("等级: B\n");
} else if (score >= 70) {
printf("等级: C\n");
} else if (score >= 60) {
printf("等级: D\n");
} else {
printf("等级: F\n");
}
return 0;
}
TEXT
📖 仅展示
等级: C
else if 的判断是自上而下的,一旦某个条件满足,后续分支全部跳过。所以条件的排列顺序很重要。
💡 把最可能满足的条件放在前面,可以提高程序效率;把范围从大到小排列,可以避免逻辑漏洞。
4. 嵌套 if
if 内部可以再嵌套 if,实现更细致的条件判断:
C
#include <stdio.h>
int main(void) {
int age = 25;
char gender = 'M';
if (age >= 18) {
if (gender == 'M') {
printf("成年男性\n");
} else {
printf("成年女性\n");
}
} else {
printf("未成年人\n");
}
return 0;
}
TEXT
📖 仅展示
成年男性
⚠️ 嵌套层数不宜超过3层,层数过多会降低可读性。复杂的条件可以用逻辑运算符组合,或者用
else if 扁平化。
5. switch-case 语句
switch 根据一个整型表达式的值,跳转到对应的 case 分支。适合对离散值做判断。
(1) 基本语法
C
switch (表达式) {
case 常量1:
语句;
break;
case 常量2:
语句;
break;
default:
语句;
break;
}
C
#include <stdio.h>
int main(void) {
int day = 3;
switch (day) {
case 1: printf("星期一\n"); break;
case 2: printf("星期二\n"); break;
case 3: printf("星期三\n"); break;
case 4: printf("星期四\n"); break;
case 5: printf("星期五\n"); break;
case 6: printf("星期六\n"); break;
case 7: printf("星期日\n"); break;
default: printf("无效的日期\n"); break;
}
return 0;
}
TEXT
📖 仅展示
星期三
(2) break 的重要性
switch 匹配到 case 后,会从该位置开始依次执行后面所有语句,直到遇到 break 或 switch 结束。这叫"贯穿"(fall-through)。
C
#include <stdio.h>
int main(void) {
int num = 2;
switch (num) {
case 1: printf("一\n");
case 2: printf("二\n");
case 3: printf("三\n");
default: printf("默认\n");
}
return 0;
}
TEXT
📖 仅展示
二
三
默认
⚠️ 忘记
break 是 switch 最常见的错误。除非刻意利用贯穿效果,否则每个 case 末尾都要加 break。
(3) 利用贯穿合并分支
有时多个 case 需要执行相同的逻辑,可以故意不加 break:
C
#include <stdio.h>
int main(void) {
char grade = 'B';
switch (grade) {
case 'A':
case 'B':
case 'C':
printf("通过\n"); break;
case 'D':
printf("补考\n"); break;
case 'F':
printf("挂科\n"); break;
default:
printf("无效等级\n"); break;
}
return 0;
}
TEXT
📖 仅展示
通过
(4) switch 的限制
- 表达式必须是整型(
int、char、enum等),不能用浮点数或字符串 case后面必须是编译期常量,不能是变量case的值不能重复
6. 条件运算符简写
条件运算符 ?: 可以替代简单的 if-else,在第6课已经介绍过,这里给出更多用法:
C
#include <stdio.h>
int main(void) {
int a = -5;
int abs_a = a >= 0 ? a : -a;
printf("|%d| = %d\n", a, abs_a);
int x = 10, y = 10;
printf("%s\n", x == y ? "相等" : "不等");
return 0;
}
TEXT
📖 仅展示
|-5| = 5
相等
💡 条件运算符可以嵌套,但可读性会迅速下降。嵌套超过一层就应该改用
if-else。
▶ 示例
根据BMI值判断体型,演示多分支条件判断:
C
#include <stdio.h>
int main(void) {
double weight = 70.0;
double height = 1.75;
double bmi = weight / (height * height);
printf("BMI: %.1f\n", bmi);
if (bmi < 18.5) {
printf("偏瘦\n");
} else if (bmi < 24.0) {
printf("正常\n");
} else if (bmi < 28.0) {
printf("偏胖\n");
} else {
printf("肥胖\n");
}
return 0;
}
TEXT
📖 仅展示
BMI: 22.9
正常
▶ 示例
用 switch 实现简易菜单选择:
C
#include <stdio.h>
int main(void) {
int choice = 2;
printf("===== 菜单 =====\n");
printf("1. 新游戏\n");
printf("2. 继续游戏\n");
printf("3. 设置\n");
printf("4. 退出\n");
printf("================\n");
printf("你的选择: %d\n", choice);
switch (choice) {
case 1: printf("开始新游戏!\n"); break;
case 2: printf("加载存档...\n"); break;
case 3: printf("打开设置面板\n"); break;
case 4: printf("退出游戏\n"); break;
default: printf("无效选择\n"); break;
}
return 0;
}
TEXT
📖 仅展示
===== 菜单 =====
1. 新游戏
2. 继续游戏
3. 设置
4. 退出
================
你的选择: 2
加载存档...
❓ 常见问题
Q
if 的大括号什么时候可以省略?A 当
if/else 后面只有一条语句时语法上可以省略,但建议始终使用,避免添加语句时忘记加括号导致bug。Q
switch 能判断浮点数或字符串吗?A 不能。
switch 只接受整型表达式,浮点数和字符串都不行。需要判断字符串只能用 if-else if 链。Q
default 分支可以省略吗?A 语法上可以省略,但建议保留,用来处理预期之外的情况,避免遗漏导致静默错误。
Q
else if 和嵌套 if 有什么区别?A
else if 是扁平的多分支结构,更易阅读;嵌套 if 是层级结构,适合条件之间有依赖关系时。两者可以互换,选可读性更好的。📖 小节
if做单条件判断,if-else二选一,else if多选一- 始终使用大括号避免悬空 else 和后续维护问题
switch适合对离散整型值做多分支判断,每个case别忘breakswitch的贯穿效果可以用来合并分支,但忘记break是常见bug来源- 条件运算符
?:适合简单的二选一,复杂逻辑用if-else
📝 作业
- 编写程序,输入一个整数,判断它是正数、负数还是零,并输出结果。
- 编写程序,输入月份(1-12),用
switch输出该月的天数(假设不是闰年,2月按28天算)。 - 编写程序,输入一个字符,判断它是大写字母、小写字母、数字还是其他字符。