第15章 循环、分支的嵌套
info

对应 GESP C++ 2 级知识块⑥ & ⑦:多层分支结构、多层循环语句

官方要求:掌握多层分支结构(if / if...else / switch 语句及相互嵌套);掌握多层循环结构(for / while / do...while 语句及相互嵌套)。

这是 2 级编程题的核心——两道编程题基本都考"嵌套 + 综合案例"。

第15章 循环、分支的嵌套

嵌套指在一个分支/循环内部完整包含另一组分支或循环,用于处理多层判断、多层重复逻辑,是复杂程序的基础结构。

15.1 分支嵌套

15.1.1 if 语句嵌套

在 if / else if / else 的代码块中再写 if 结构。 规则:else 匹配最近、未配对的 if,大括号可明确划分层级。

示例:成绩分级

int score = 85;
if (score >= 60)
{
if (score >= 90)
cout << "优秀";
else if (score >= 80)
cout << "良好";
else
cout << "及格";
}
else
{
cout << "不及格";
}

15.1.2 switch 语句嵌套

case、default 内部可写完整 switch;内层 break 只跳出内层,不影响外层。

int a = 1, b = 2;
switch (a)
{
case 1:
printf("a=1\n");
switch (b)
{
case 2: printf("b=2\n"); break;
default: break;
}
break;
default: break;
}
tip

switch 易错 忘了写 break 会继续往下"穿透"执行下一个 case。嵌套时更要注意:内层 break 只管内层。2 级通常只考单层或简单两层 switch。

15.2 循环嵌套

循环体内包含另一循环,外层走一次,内层完整跑完一轮。多用于打印图形、二维遍历。

15.2.1 for 嵌套(最常用)

打印 5 行 5 列星号:

for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= 5; j++)
cout << "*";
cout << endl;
}

15.2.2 while 嵌套

int i = 1;
while (i <= 3)
{
int j = 1, sum = 0;
while (j <= 2)
{
sum += i * j;
j++;
}
i++;
}

15.2.3 不同循环互相嵌套

for 套 do-while、while 套 for 都合法。

15.3 分支与循环互相嵌套

15.3.1 循环内套 if(高频)

求 1~10 偶数和:

int sum = 0;
for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
sum += i;
}

15.3.2 if 内套循环

仅满足条件才执行循环:

int n;
cin >> n;
if (n > 0)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
cout << j << "*" << i << "=" << i * j << " ";
cout << endl;
}
}
caution

核心注意事项(必看)

  1. 内外循环变量名必须不同(i、j 区分),否则内层会把外层变量改乱;
  2. break / continue 只作用当前最内层循环 / switch;
  3. 嵌套层数不宜过多,降低可读性;
  4. 用缩进区分层级,大括号避免 else 匹配错误;
  5. 保证内层循环有终止条件,防止死循环。
tip

综合练习题(2 级风格) 输入一个正整数 n,输出 1~n 中所有既能被 3 整除又能被 5 整除的数。思路:外层 for 遍历 1~n,循环内 if (i % 3 == 0 && i % 5 == 0) 才输出。这就是"循环 + 分支"最典型的组合。

练习题(2 级单选风格)

  1. 下列代码执行后输出什么?
    int s = 0;
    for (int i = 1; i <= 3; i++)
    for (int j = 1; j <= 2; j++)
    s++;
    cout << s;
    • A. 5
    • B. 6
    • C. 3
    • D. 2
  2. 下列代码执行后输出什么?
    int n = 5;
    if (n > 0) {
    if (n > 3) cout << "A";
    else cout << "B";
    } else cout << "C";
    • A. A
    • B. B
    • C. C
    • D. 无输出
  3. 在双重循环的内层循环中执行 break;,会?
    • A. 跳出最内层循环
    • B. 跳出最外层循环
    • C. 结束整个程序
    • D. 跳过本次迭代
  4. 下列代码执行后输出什么?
    for (int i = 1; i <= 3; i++) {
    if (i == 2) continue;
    cout << i;
    }
    • A. 123
    • B. 13
    • C. 12
    • D. 23
  5. 下列代码执行后输出什么?
    int cnt = 0;
    for (int i = 1; i <= 3; i++)
    for (int j = i; j <= 3; j++)
    cnt++;
    cout << cnt;
    • A. 6
    • B. 9
    • C. 3
    • D. 0
参考答案(点击展开)
  1. B — 外层 3 次、内层每次 2 次,共 3×2=6 次自增,s=6。
  2. A — n=5>0 进入外层,再 n>3 成立,输出 "A";"B""C" 分支都不走。
  3. A — break 只跳出当前所在的那一层循环(最内层),外层继续。
  4. B — i==2 时 continue 跳过本次输出;i=1 输出 1,i=3 输出 3,结果 "13"。
  5. A — 内层从 j=i 到 3:i=1 计 3 次、i=2 计 2 次、i=3 计 1 次,合计 6。
SShowball OI知识手册