6 分支嵌套与switch

正在加载视频播放器…

GESP C++ 一级:分支嵌套与 switch 精讲

核心目标:掌握嵌套 if、switch 语句的写法与执行流程,理解悬空 else、break 穿透、循环嵌套层次等易错点。
嵌套就是“里面再套一层”;switch 是多路选择,靠 break 跳出,靠 default 兜底。


一、什么是分支嵌套

嵌套,就是在一个结构里面再写一个同类型或不同类型的结构。

一级常见嵌套:

嵌套类型 示例 常见用途
嵌套 if if 里面再写 if 多条件判断
switch 嵌套 switch 里面再写 switch 复杂菜单选择

二、嵌套 if

1. 基本形式

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

示例:判断两个数都为正数

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

if (a > 0) {
    if (b > 0) {
        cout << "都为正数" << endl;
    }
}

也可以写成:

if (a > 0 && b > 0) {
    cout << "都为正数" << endl;
}

2. 嵌套 if-else

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

3. 悬空 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 不正";
}

一级重点:嵌套 if 建议每个 if、else 都加 {},避免悬空 else。

4. 嵌套 if 求三个数最大值

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;

三、switch 语句

1. 基本语法

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

2. 执行流程

  1. 计算 switch 后面表达式的值。
  2. 与各个 case 后的常量比较。
  3. 匹配成功,从该 case 开始执行。
  4. 遇到 break,跳出整个 switch。
  5. 如果没有匹配,执行 default。
  6. 如果没有 default,什么都不做。

3. 示例:根据数字输出星期

int day;
cin >> day;

switch (day) {
    case 1:
        cout << "星期一";
        break;
    case 2:
        cout << "星期二";
        break;
    case 3:
        cout << "星期三";
        break;
    case 4:
        cout << "星期四";
        break;
    case 5:
        cout << "星期五";
        break;
    case 6:
        cout << "星期六";
        break;
    case 7:
        cout << "星期日";
        break;
    default:
        cout << "输入错误";
}

4. 示例:简单计算器

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;
}

5. break 的作用

break 用于跳出 switch。

如果省略 break,会发生“穿透”:

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

输出:

二三其他

因为匹配 case 2 后,没有 break,继续执行 case 3 和 default。

一级重点:switch 中每个 case 后面一般都要写 break,除非故意利用穿透。

6. default 的作用

default 处理所有 case 都不匹配的情况,类似 if-else 中的 else。

switch (op) {
    case '+':
        // ...
        break;
    default:
        cout << "未知运算符";
}

default 可以放在任意位置,但通常放在最后。

7. switch 的注意事项

  • switch 后面的表达式必须是整数、字符或枚举类型。
  • case 后面必须是常量,不能是变量。
  • 每个 case 后的常量不能重复。
  • break 不能忘,否则穿透。
  • switch 不能直接判断范围,如 case score >= 90 是错误的。
  • switch 适合固定取值,不适合范围判断。

四、switch 与 if 的对比

项目 if-else if switch
判断条件 关系、逻辑、范围 固定取值相等
适合场景 成绩等级、范围判断 菜单、运算符、数字分支
条件类型 任意 bool 表达式 整数、字符
穿透 无 不写 break 会穿透
灵活度 高 较低
一级要求 重点掌握 会读会写简单题

选择建议:

  • 范围判断用 if。
  • 固定取值用 switch。
  • 不确定时用 if。

五、嵌套与 switch 结合

switch 可以嵌套在 if 中,也可以嵌套在循环中。

1. if 嵌套 switch

if (a > 0) {
    switch (op) {
        case '+':
            cout << a + b;
            break;
        default:
            cout << "错误";
    }
}

2. switch 嵌套 switch

switch (a) {
    case 1:
        switch (b) {
            case 1:
                cout << "11";
                break;
            default:
                cout << "1x";
        }
        break;
    default:
        cout << "x";
}

一级中 switch 嵌套较少考,了解即可。


六、常见错误

  1. 悬空 else

    if (a > 0)
        if (b > 0)
            cout << "都正";
    else
        cout << "a 不正";   // else 和里面 if 配对
    

    解决:加花括号。

  2. switch 忘记 break

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

    case x:   // 错误,case 后必须是常量
    
  4. switch 判断范围

    switch (score) {
        case score >= 90:   // 错误
    }
    

    范围判断应使用 if。

  5. switch 表达式类型错误

    switch (3.14) {   // 错误,不能是浮点数
    }
    
  6. default 位置随意导致逻辑混乱
    建议放在最后。

  7. 嵌套层次过深
    一级代码尽量简洁,嵌套不超过 2~3 层。

  8. 输出格式错误
    注意换行、空格,按题目要求输出。


七、阅读程序写结果

题目 1

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

输出:

A

题目 2

int x = 2;
switch (x) {
    case 1:
        cout << "A";
        break;
    case 2:
        cout << "B";
        break;
    case 3:
        cout << "C";
        break;
    default:
        cout << "D";
}

输出:

B

题目 3

int x = 2;
switch (x) {
    case 1:
        cout << "A";
    case 2:
        cout << "B";
    case 3:
        cout << "C";
    default:
        cout << "D";
}

输出:

BCD

题目 4

char op = '*';
int a = 3, b = 4;
switch (op) {
    case '+':
        cout << a + b;
        break;
    case '-':
        cout << a - b;
        break;
    case '*':
        cout << a * b;
        break;
    default:
        cout << "错误";
}

输出:

12

题目 5

int x = 5;
switch (x) {
    case 1:
        cout << "1";
    case 2:
        cout << "2";
    default:
        cout << "其他";
}

输出:

其他

解释:没有匹配的 case,执行 default。


八、速查表

需求 写法
嵌套 if if (条件1) { if (条件2) { ... } }
避免悬空 else 每个 if、else 加 {}
switch 基本结构 switch (表达式) { case 常量: ... break; default: ... }
跳出 switch break
默认分支 default
范围判断 用 if,不用 switch
固定取值 用 switch

九、总结

嵌套与 switch 是一级分支和循环结构的进阶内容。

  1. 嵌套就是结构里面再套结构。
  2. 嵌套 if 中,else 和最近的未匹配 if 配对,建议加花括号。
  3. switch 适合固定取值判断,case 后必须是常量。
  4. switch 中 break 用来跳出,忘了会穿透。
  5. default 处理所有不匹配的情况。
  6. 范围判断用 if,固定取值用 switch。

复习时多练“阅读程序写结果”类题,重点注意嵌套层次、break、default 和输出格式。考试中先看清题目要求,再选择 if 还是 switch,最后逐行检查花括号、分号和换行。