5 多分支

正在加载视频播放器…

GESP C++ 一级讲义:多分支结构精讲

核心目标:掌握 if-else if-else 多分支链、嵌套 if 实现多分支、switch 基本用法,理解“从上到下判断,一真即停”的执行流程。
多分支就是多个条件选一个执行;条件按顺序判断,一旦成立,后面的分支全部跳过。


一、什么是多分支

多分支,就是程序面临三种或三种以上的情况,需要根据条件选择其中一条路执行。

例如:

  • 成绩等级:A、B、C、D、E
  • 数的分类:正数、负数、零
  • 字符分类:数字、大写字母、小写字母、其他字符
  • 月份天数:1、3、5、7、8、10、12 月 31 天;4、6、9、11 月 30 天;2 月特殊

一级中实现多分支主要有三种方式:

方式 语法 一级重要程度
if-else if-else 链 多个 if 串起来 重点掌握
嵌套 if if 里面再写 if 掌握
switch 多路选择 了解,会读会写简单题

二、if-else if-else 多分支

1. 基本语法

if (条件1) {
    语句块1;
} else if (条件2) {
    语句块2;
} else if (条件3) {
    语句块3;
} else {
    语句块4;
}

说明:

  • 条件1 成立,执行语句块1,后面全部跳过。
  • 条件1 不成立,判断 条件2。
  • 条件2 成立,执行语句块2,后面全部跳过。
  • 依次往下。
  • 如果所有条件都不成立,执行 else。
  • else 可以省略,但建议写,用来处理“其他情况”。

2. 执行流程

判断条件1 → 真 → 执行语句块1 → 结束整个多分支
         → 假 → 判断条件2
                  → 真 → 执行语句块2 → 结束
                  → 假 → 判断条件3
                           → 真 → 执行语句块3 → 结束
                           → 假 → 执行 else

核心口诀:

从上到下,逐个判断;
一真即停,其余跳过;
全假才走 else。

3. 示例:正数、负数、零

int n;
cin >> n;

if (n > 0) {
    cout << "正数" << endl;
} else if (n < 0) {
    cout << "负数" << endl;
} else {
    cout << "零" << endl;
}

输入 5 → 正数
输入 -3 → 负数
输入 0 → 零

4. 示例:成绩等级

int score;
cin >> score;

if (score >= 90) {
    cout << "A" << endl;
} else if (score >= 80) {
    cout << "B" << endl;
} else if (score >= 70) {
    cout << "C" << endl;
} else if (score >= 60) {
    cout << "D" << endl;
} else {
    cout << "E" << endl;
}

注意:这里必须从高分到低分判断。
如果先判断 score >= 60,那 95 分也会先满足,输出 D,逻辑就错了。


三、多分支的条件顺序

多分支的条件顺序非常重要,特别是区间判断。

1. 区间从大到小

成绩等级推荐:

if (score >= 90) { }
else if (score >= 80) { }
else if (score >= 70) { }
else if (score >= 60) { }
else { }

因为 score >= 90 已经排除了 90 以上,后面 score >= 80 实际表示 80 <= score < 90。

2. 区间从小到大

也可以从小到大写,但条件要写完整:

if (score < 60) {
    cout << "E";
} else if (score < 70) {
    cout << "D";
} else if (score < 80) {
    cout << "C";
} else if (score < 90) {
    cout << "B";
} else {
    cout << "A";
}

3. 条件互斥

多分支的条件最好互斥,也就是不能同时成立。

if (n > 0) {
    // 正数
} else if (n < 0) {
    // 负数
} else {
    // 零
}

这三个条件互斥且覆盖所有情况。

4. 条件重叠的后果

if (score >= 60) {
    cout << "D";
} else if (score >= 90) {
    cout << "A";
}

95 分先满足 score >= 60,输出 D,后面的 score >= 90 永远轮不到。
所以顺序错误会导致结果错误。


四、嵌套 if 实现多分支

if 里面还可以写 if,形成嵌套分支。

1. 示例:判断三个数最大值

int a, b, c;
cin >> a >> b >> c;

int maxv;
if (a > b) {
    if (a > c) {
        maxv = a;
    } else {
        maxv = c;
    }
} else {
    if (b > c) {
        maxv = b;
    } else {
        maxv = c;
    }
}

cout << maxv << endl;

更简单的写法:

int maxv = a;
if (b > maxv) maxv = b;
if (c > maxv) maxv = c;
cout << maxv << endl;

2. 悬空 else

else 总是和最近的、未匹配的 if 配对。

if (a > 0)
    if (b > 0)
        cout << "都正";
else
    cout << "a 不正";

这里的 else 实际和 if (b > 0) 配对,不是和 if (a > 0) 配对。

解决方法:加花括号。

if (a > 0) {
    if (b > 0) {
        cout << "都正";
    }
} else {
    cout << "a 不正";
}

五、switch 多分支(了解,下个章节会有拓展)

switch 适合判断一个表达式的多个固定取值。

1. 基本语法

switch (表达式) {
    case 常量1:
        语句块1;
        break;
    case 常量2:
        语句块2;
        break;
    default:
        语句块3;
}

2. 示例:根据运算符计算

char op;
int a, b;
cin >> a >> op >> b;

switch (op) {
    case '+':
        cout << a + b << endl;
        break;
    case '-':
        cout << a - b << endl;
        break;
    case '*':
        cout << a * b << endl;
        break;
    case '/':
        cout << a / b << endl;
        break;
    default:
        cout << "错误" << endl;
}

3. 注意事项

  • case 后面必须是常量,不能是变量。
  • break 用来跳出 switch。
  • 如果不写 break,会继续执行下一个 case,称为“穿透”。
  • default 处理其他情况,可选。
  • switch 的判断值通常是整数或字符。

4. switch 与 if 的选择

场景 推荐
范围判断,如成绩等级 if-else if
大小比较,如 a > b if
固定取值,如运算符 + - * / switch
复杂逻辑组合 if

一级建议:优先掌握 if-else if-else,switch 会读会写简单题即可。


六、常见多分支模型

1. 正数、负数、零

if (n > 0) {
    cout << "正数";
} else if (n < 0) {
    cout << "负数";
} else {
    cout << "零";
}

2. 成绩等级

if (score >= 90) {
    cout << "A";
} else if (score >= 80) {
    cout << "B";
} else if (score >= 70) {
    cout << "C";
} else if (score >= 60) {
    cout << "D";
} else {
    cout << "E";
}

3. 字符分类

char c;
cin >> c;

if (c >= '0' && c <= '9') {
    cout << "数字";
} else if (c >= 'A' && c <= 'Z') {
    cout << "大写字母";
} else if (c >= 'a' && c <= 'z') {
    cout << "小写字母";
} else {
    cout << "其他字符";
}

4. 判断闰年

if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
    cout << "闰年";
} else {
    cout << "平年";
}

这是双分支,不是多分支,但常和多分支结合。

5. 月份天数

int m;
cin >> m;

if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
    cout << 31;
} else if (m == 4 || m == 6 || m == 9 || m == 11) {
    cout << 30;
} else if (m == 2) {
    cout << 28;
} else {
    cout << "月份错误";
}

6. 简单计算器

char op;
int a, b;
cin >> a >> op >> b;

if (op == '+') {
    cout << a + b;
} else if (op == '-') {
    cout << a - b;
} else if (op == '*') {
    cout << a * b;
} else if (op == '/') {
    cout << a / b;
} else {
    cout << "错误";
}

七、多分支易错点

  1. 条件顺序错误

    if (score >= 60) {
        cout << "D";
    } else if (score >= 90) {
        cout << "A";
    }
    

    95 分也会输出 D。应从高到低判断。

  2. = 与 == 混淆

    if (a = 1)    // 赋值,条件恒为真
    if (a == 1)   // 正确
    
  3. if 后多写分号

    if (a > 0);   // 错误,if 空执行
    
  4. 花括号漏写

    if (a > 0)
        cout << "正";
        cout << "数";   // 不受 if 控制
    
  5. 悬空 else
    建议每个 if、else 都加花括号。

  6. 范围判断连写

    if (0 < a < 10)        // 错误逻辑
    if (a > 0 && a < 10)   // 正确
    
  7. 逻辑运算符优先级

    if (a > 0 || b > 0 && c > 0)   // && 高于 ||
    

    建议加括号:

    if ((a > 0 || b > 0) && c > 0)
    
  8. switch 忘记 break

    case '+':
        cout << a + b;
        // 缺少 break,会继续执行后面的 case
    
  9. switch 的 case 用变量

    case x:   // 错误,case 后必须是常量
    
  10. 输出多余提示语
    考试时不要输出“请输入”等提示。


八、阅读程序写结果

题目 1

int n = 0;
if (n > 0) {
    cout << "正";
} else if (n < 0) {
    cout << "负";
} else {
    cout << "零";
}

输出:

零

题目 2

int score = 85;
if (score >= 90) {
    cout << "A";
} else if (score >= 80) {
    cout << "B";
} else if (score >= 70) {
    cout << "C";
} else {
    cout << "D";
}

输出:

B

题目 3

int score = 95;
if (score >= 60) {
    cout << "D";
} else if (score >= 90) {
    cout << "A";
}

输出:

D

解释:条件顺序错误,95 先满足 score >= 60。

题目 4

char c = '7';
if (c >= '0' && c <= '9') {
    cout << "数字";
} else if (c >= 'A' && c <= 'Z') {
    cout << "大写";
} else if (c >= 'a' && c <= 'z') {
    cout << "小写";
} else {
    cout << "其他";
}

输出:

数字

题目 5

int a = 3, b = 5, c = 4;
if (a > b) {
    cout << "A";
} else if (b > c) {
    cout << "B";
} else {
    cout << "C";
}

输出:

B

解释:a > b 假,b > c 真,输出 B。

题目 6

int x = 2;
switch (x) {
    case 1:
        cout << "一";
        break;
    case 2:
        cout << "二";
        break;
    case 3:
        cout << "三";
        break;
    default:
        cout << "其他";
}

输出:

二

题目 7

int x = 2;
switch (x) {
    case 1:
        cout << "一";
    case 2:
        cout << "二";
    case 3:
        cout << "三";
    default:
        cout << "其他";
}

输出:

二三其他

解释:没有 break,发生穿透。


九、速查表

需求 写法
多分支基本结构 if (条件1) { } else if (条件2) { } else { }
判断正负零 if (n > 0) ... else if (n < 0) ... else ...
成绩等级 从高到低判断
字符分类 if (c >= '0' && c <= '9') ...
嵌套 if if 里面再写 if
避免悬空 else 每个分支加花括号
switch 基本结构 switch (表达式) { case 常量: ... break; default: ... }
switch 跳出 break
switch 默认分支 default
范围判断 用 && 连接,如 a > 0 && a < 10

十、总结

多分支是一级分支结构中的重点。

  1. 多分支用于三种或更多情况的选择。
  2. if-else if-else 从上到下判断,一真即停。
  3. 条件顺序很重要,区间判断通常从大到小或从小到大。
  4. 所有条件都不成立时,才执行最后的 else。
  5. 嵌套 if 中,else 和最近的未匹配 if 配对,建议加花括号。
  6. switch 适合固定取值判断,case 后必须是常量,break 不能忘。
  7. 多分支常与关系运算符、逻辑运算符结合,注意 ==、&&、|| 和括号。

复习时多练“阅读程序写结果”和“根据条件写多分支”两类题,重点注意条件顺序、边界值、花括号、break 和输出格式。考试中先读清题目有几种情况,再确定分支顺序,最后逐条检查条件是否互斥、是否覆盖全部情况。