C 语言分支结构(if-else 和 switch-case)详解及实战
·
分支结构保姆级精讲:if-else/switch-case 实战(零基础也能看懂)
核心知识点
吃透 C 语言两大 “选择工具”:if-else(应对灵活条件判断)和switch-case(适配固定值匹配),掌握语法格式、实战用法,避开新手必踩坑,能独立写出成绩分级、菜单程序。
一、先搞懂:为什么需要分支结构?(零基础必看)
编程的核心是 “让电脑帮我们做事”,而生活中到处都是 “选择”:
- 去超市:“钱够就买奶茶,不够就买矿泉水”
- 查成绩:“60 分以上及格,以下要补考”
- 用 APP:“点 1 查物流,点 2 退款,点 3 联系客服”
如果没有分支结构,程序只能 “一条路走到黑”(比如不管成绩多少,都只显示 “及格”)。分支结构就是给程序装 “大脑”,让它能根据不同情况做不同决策。
二、if-else 结构:灵活判断,想怎么选就怎么选
if-else是最常用的分支结构,特点是 “条件灵活”—— 不管是范围判断(比如≥60)、多条件组合(比如≥60 且≤80),都能搞定。
1. 单分支:满足条件才执行(只有 “做” 或 “不做”)
语法格式(逐字解释)
if (条件表达式) { // if:“如果”;括号里写判断条件(结果是“真”或“假”)
执行语句; // 条件为“真”(非0)时,才会执行这里的代码
}
// 条件为“假”(0)时,跳过上面的语句,执行后面的代码
零基础须知
- 条件表达式:比如
num > 0(num 大于 0)、score == 100(score 等于 100),结果只有两种:真(电脑里用 “非 0” 表示,比如 1)、假(电脑里用 “0” 表示)。 - 花括号
{}:把要执行的语句 “包起来”,如果只写 1 行语句,{}可以省略,但零基础建议必写(避免后续出错)。
实战示例:判断一个数是否为正数
#include <stdio.h> // 包含输入输出函数(比如printf、scanf)
int main() { // 程序入口,所有代码从这里开始执行
int num; // 定义一个整数变量num(用来存输入的数字)
// 提示用户输入
printf("请输入一个整数:"); // 屏幕上显示文字
scanf("%d", &num); // 读取用户输入的数字,存到num里(&是“取地址”,必须加)
// 单分支判断:如果num是正数,就输出提示
if (num > 0) {
printf("%d是正数!\n", num); // 条件为真时执行
}
printf("程序结束~\n"); // 不管条件是否满足,都会执行这句话
return 0;
}
运行效果
- 输入
5:屏幕显示 “5 是正数!”→“程序结束~”- 输入
-3:屏幕直接显示 “程序结束~”- 输入
0:屏幕直接显示 “程序结束~”(0 既不是正数也不是负数)
2. 双分支:二选一(要么 A,要么 B)
语法格式
if (条件表达式) {
执行语句1; // 条件为真,执行这里
} else { // else:“否则”(条件为假时)
执行语句2; // 条件为假,执行这里
}
实战示例:判断成绩是否及格(最常用场景)
#include <stdio.h>
int main() {
int score; // 存成绩的变量(0-100)
printf("请输入你的成绩(0-100):");
scanf("%d", &score);
// 双分支判断:及格或不及格
if (score >= 60) { // 条件:成绩≥60
printf("恭喜!成绩及格~\n");
} else { // 条件不满足(成绩<60)
printf("很遗憾,成绩不及格,需要补考~\n");
}
return 0;
}
运行效果
- 输入
75:显示 “恭喜!成绩及格~”- 输入
58:显示 “很遗憾,成绩不及格,需要补考~”
3. 多分支:多重选择(多个条件,选一个执行)
语法格式
if (条件1) {
执行语句1; // 条件1为真,执行这里(执行完跳过后面所有)
} else if (条件2) { // else if:“否则如果”(条件1为假,才判断条件2)
执行语句2; // 条件2为真,执行这里
} else if (条件3) {
执行语句3;
} else { // 所有条件都为假,执行这里(可选)
执行语句4;
}
实战示例:成绩分级(零基础必练)
需求:输入 0-100 的成绩,输出等级:90 + 优秀、80-89 良好、70-79 中等、60-69 及格、<60 不及格,还要过滤非法成绩(比如 101、-5)。
运行效果
#include <stdio.h>
int main() {
int score;
printf("请输入你的成绩(0-100):");
scanf("%d", &score);
// 第一步:先过滤非法成绩(必须放在最前面!)
if (score < 0 || score > 100) { // || 表示“或者”,只要一个条件满足就为真
printf("输入错误!成绩必须在0-100之间~\n");
} else if (score >= 90) { // 条件:90≤score≤100(因为前面已经过滤了>100)
printf("成绩等级:优秀\n");
} else if (score >= 80) { // 隐含条件:80≤score<90(前面没满足≥90)
printf("成绩等级:良好\n");
} else if (score >= 70) { // 隐含条件:70≤score<80
printf("成绩等级:中等\n");
} else if (score >= 60) { // 隐含条件:60≤score<70
printf("成绩等级:及格\n");
} else { // 所有条件都不满足,即score<60
printf("成绩等级:不及格\n");
}
return 0;
}
- 输入
95:优秀- 输入
83:良好- 输入
60:及格- 输入
59:不及格- 输入
105:输入错误!成绩必须在 0-100 之间~
4. 新手必踩的 3 个坑(附解决方案)
坑 1:用=(赋值)代替==(判断相等)
- 反例(错误代码):
if (score = 60) { // 这里是“赋值”,不是“判断”! printf("及格~"); } - 问题:
score = 60是把 60 赋值给 score,不管原来 score 是多少,结果都是 “真”(非 0),所以永远会显示 “及格~”。 - 正解:判断两个值是否相等,必须用
==:if (score == 60) { // 正确:判断score是否等于60 printf("刚好及格~"); }
坑 2:忘记加{},导致执行范围出错
- 反例(错误代码):
if (score >= 60) printf("及格~\n"); printf("继续加油~\n"); // 这个语句不管条件是否满足,都会执行! - 问题:没有
{}时,if只管辖 “紧跟的那 1 行语句”,第 2 行printf不属于if的范围。 - 正解:不管多少行语句,都用
{}包起来(规范写法):if (score >= 60) { printf("及格~\n"); printf("继续加油~\n"); // 只有条件满足才执行 }
坑 3:多分支条件顺序颠倒,导致逻辑失效
- 反例(错误代码):
if (score >= 60) { // 先判断及格,再判断优秀 printf("及格~"); } else if (score >= 90) { printf("优秀~"); // 永远不会执行! } - 问题:如果输入 95,会先满足
score >= 60,执行 “及格~”,后面的else if就跳过了,优秀永远判断不到。 - 正解:多分支按 “从大到小” 或 “从小到大” 有序排列(比如先判断 90+,再判断 80+,最后判断 60+)。
三、switch-case 结构:固定值匹配,代码更简洁
switch-case适合 “多个固定值匹配” 的场景(比如输入 1 选查询、输入 2 选添加),比if-else更简洁,执行效率也更高。
1. 基础语法(逐字解释)
switch (表达式) { // 表达式必须是“整型”(int、char等),比如choice、'A'
case 常量1: // case:“情况”;后面跟固定常量(比如1、2、'A')
执行语句1;
break; // break:“跳出”switch,执行完后不再管后面的case
case 常量2:
执行语句2;
break;
...
default: // default:“默认情况”(所有case都不匹配时执行,可选)
执行语句n;
break;
}
零基础须知
- 表达式类型限制:不能是 float、double(比如
switch (3.14)会编译报错),因为浮点型有精度误差,无法精准匹配。 - 常量要求:
case后面必须是 “固定值”(比如 1、'B'、100),不能是变量(比如case choice会报错)。 break的作用:必须加!否则会 “穿透” 到下一个 case(比如输入 1,会执行 case1、case2、default 的所有语句)。
2. 实战示例:简易菜单程序(日常开发常用)
需求:写一个管理系统的菜单,输入 1-5 选择功能,输入其他则提示错误。
#include <stdio.h>
int main() {
int choice; // 存用户的选择(1-5)
// 打印菜单(让用户知道能选什么)
printf("===== 学生信息管理系统 =====\n");
printf("1. 查询学生信息\n");
printf("2. 添加学生信息\n");
printf("3. 修改学生信息\n");
printf("4. 删除学生信息\n");
printf("5. 退出系统\n");
printf("==========================\n");
printf("请输入你的选择(1-5):");
scanf("%d", &choice);
// switch-case匹配选择
switch (choice) {
case 1: // 选择1:查询
printf("\n正在查询学生信息...\n");
printf("查询成功!姓名:小明,成绩:92\n");
break; // 跳出switch,避免执行后面的case
case 2: // 选择2:添加
printf("\n正在添加学生信息...\n");
printf("添加成功!新学生:小红,成绩:85\n");
break;
case 3: // 选择3:修改
printf("\n正在修改学生信息...\n");
printf("修改成功!小明成绩改为95\n");
break;
case 4: // 选择4:删除
printf("\n正在删除学生信息...\n");
printf("删除成功!小红信息已删除\n");
break;
case 5: // 选择5:退出
printf("\n感谢使用,再见!\n");
break;
default: // 输入其他数字:错误提示
printf("\n输入错误!请重新输入1-5之间的数字~\n");
break;
}
return 0;
}
运行效果
- 输入
1:显示查询结果- 输入
5:显示 “感谢使用,再见!”- 输入
6:显示 “输入错误!请重新输入 1-5 之间的数字~”
3. 关键注意点(新手必记)
(1)break不能漏!(最容易出错)
- 反例(无 break 的穿透效果):
switch (choice) { case 1: printf("查询\n"); // 输入1时,会执行case1、case2、default所有语句 case 2: printf("添加\n"); default: printf("错误\n"); } - 后果:输入 1,屏幕会显示 “查询→添加→错误”,逻辑完全混乱。
- 特殊用途:如果多个 case 需要执行同一逻辑,可以利用 “穿透”(必须写注释说明):
case 1: case 2: // 输入1或2,都执行下面的语句 printf("查询和添加功能正在维护中~\n"); break;
(2)case后面必须是常量
- 反例(错误代码):
int num = 2; switch (choice) { case num: // 错误!case后面不能是变量 printf("执行..."); break; } - 正解:
case 2:case 'A':(char 类型本质是整型,比如 'A' 的 ASCII 值是 65)。
(3)default可以省略,但建议加
- 如果省略
default,当输入的 值没有匹配到任何 case 时,switch 会直接跳过,不执行任何语句(用户不知道自己输入错了)。 - 加上
default,可以给用户明确的错误提示,体验更好。
四、if-else vs switch-case:到底该用哪个?(零基础快速选)
| 对比维度 | if-else | switch-case |
|---|---|---|
| 适用场景 | 1. 范围判断(比如 score≥60、age>18);2. 多条件组合(比如 score≥60 && score≤80,&& 表示 “并且”);3. 条件数量少或多(无上限) | 1. 固定值匹配(比如输入 1/2/3、字符 'A'/'B');2. 条件数量中等(3-10 个固定值) |
| 代码简洁度 | 条件多且是固定值时,代码冗长 | 固定值匹配时,代码更简洁易读 |
| 执行效率 | 条件越多,效率越低(逐个判断) | 效率高(直接匹配常量,不用逐个判断) |
一句话总结
- 想判断 “范围”(比如≥、≤、&&、||)→ 用
if-else; - 想匹配 “固定值”(比如 1、2、3,'A'、'B')→ 用
switch-case。
五、课后实战练习(零基础必做,附提示)
练习 1:判断闰年(经典面试题)
需求:输入一个年份,判断是否为闰年。闰年条件:
- 能被 4 整除,但不能被 100 整除(比如 2020 年是闰年,1900 年不是);
- 能被 400 整除(比如 2000 年是闰年)。提示:用
%(取余运算符)判断是否能整除(比如year % 4 == 0表示能被 4 整除),用&&(并且)、||(或者)组合条件。
练习 2:判断字符类型
需求:输入一个字符,用 switch-case 判断它是 “大写字母”(A-Z)、“小写字母”(a-z)、“数字”(0-9)还是 “其他字符”(比如!、@)。提示:char 类型可以直接用 switch 判断,比如case 'A': case 'B': ... case 'Z':(利用穿透效果)。
更多推荐




所有评论(0)