分支结构保姆级精讲: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:判断闰年(经典面试题)

需求:输入一个年份,判断是否为闰年。闰年条件:

  1. 能被 4 整除,但不能被 100 整除(比如 2020 年是闰年,1900 年不是);
  2. 能被 400 整除(比如 2000 年是闰年)。提示:用%(取余运算符)判断是否能整除(比如year % 4 == 0表示能被 4 整除),用&&(并且)、||(或者)组合条件。

练习 2:判断字符类型

需求:输入一个字符,用 switch-case 判断它是 “大写字母”(A-Z)、“小写字母”(a-z)、“数字”(0-9)还是 “其他字符”(比如!、@)。提示:char 类型可以直接用 switch 判断,比如case 'A': case 'B': ... case 'Z':(利用穿透效果)。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐