跳转至

循环嵌套

基本语法

循环里面,再放一个循环,叫作循环嵌套,也称多重循环。

for (int i = 1; i <= 2; i++) {
    for (int j = 1; j <= 3; j++) {
        cout << '*';
    }
    cout << '\n';
}

输出:

***
***

外层执行一轮,内层从头到尾执行一遍。

i 管行,j 管列。第一行时,j 依次是 1、2、3;第二行,又重新从 1 开始。

总共输出 2 × 3 = 6 个星号,不是 2 + 3 个。

观察执行顺序

for (int i = 1; i <= 2; i++) {
    for (int j = 1; j <= 3; j++) {
        cout << '(' << i << ',' << j << ") ";
    }
    cout << '\n';
}

输出:

(1,1) (1,2) (1,3)
(2,1) (2,2) (2,3)

i 暂时不变,j 先走完;之后 i 增加,j 重新开始。

内层的次数,也可以由外层变量决定。

for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= i; j++) {
        cout << '*';
    }
    cout << '\n';
}

输出:

*
**
***

一共输出 1 + 2 + 3 = 6 个星号,不是 9 个。要看每轮实际执行几次,不能只看有几层循环。

换行的位置

一行输出完,再换行。 换行写在内层循环后面,外层循环里面。

放进内层循环,会变成一个星号一行;放到外层循环外面,就会把所有星号挤在同一行。

break 在嵌套循环中的作用

for (int i = 1; i <= 2; i++) {
    for (int j = 1; j <= 3; j++) {
        if (j == 2) {
            break;
        }
        cout << i << ',' << j << ' ';
    }
}

输出 1,1 2,1。

break 只跳出内层循环,外层还会继续。 下一轮进入内层时,j 又从 1 开始。

continue 也只影响它所在的那一层循环,不会直接开始下一轮外层循环。

常见错误

内外层,不要误用同一个循环变量。

外层用 i,内层用 j,再一层用 k,先保持一致。

看清内层的起点和终点。

从 1、i、i+1 开始,表示的选择范围不同;j <= n 和 j <= i,执行次数也不同。

注意大括号和缩进。

一层一层对齐,才能看清换行、判断、变量更新,分别属于哪一层。