循环结构的嵌套

一、循环嵌套的概念

一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内层的循环可以再嵌套更内层的循环,形成多层嵌套。

while、do…while 和 for 三种循环语句可以互相嵌套,即 for 循环中可以有 while 循环,while 循环中也可以有 for 循环,没有限制。

二、循环嵌套的执行流程

外层循环每执行一次,内层循环就完整地执行一轮(从初始化到结束)。

以两层嵌套为例:

  1. 外层循环执行第 1 次 → 进入循环体 → 内层循环从头到尾完整执行一遍 → 回到外层循环判断条件。
  2. 外层循环执行第 2 次 → 内层循环再次从头到尾完整执行一遍。
  3. 以此类推,直到外层循环条件为 false,整个嵌套循环结束。

三、示例:输出九九乘法表

以下代码使用两层 for 循环输出九九乘法表:

for (int i = 1; i <= 9; i++)
{
    for (int j = 1; j <= i; j++)
    {
        cout << i << " x " << j << " = " << i * j << "  ";
    }
    cout << "\n";
}Code language: JavaScript (javascript)

分析:外层循环变量 i 表示行号(1~9),内层循环变量 j 表示列号(1~i)。每一行输出 i 行 i 列个乘法算式,形成下三角形式的九九乘法表。

四、代码示例

以下代码演示了循环嵌套的各种用法:

#include <iostream>
using namespace std;

int main()
{
    // 示例1:九九乘法表(下三角)
    cout << "九九乘法表:" << endl;
    for (int i = 1; i <= 9; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            cout << j << "x" << i << "=" << j * i << "\t";
        }
        cout << endl;
    }

    // 示例2:九九乘法表(完整矩形)
    cout << "\n完整九九乘法表:" << endl;
    for (int i = 1; i <= 9; i++)
    {
        for (int j = 1; j <= 9; j++)
        {
            cout << i << "x" << j << "=" << i * j << "\t";
        }
        cout << endl;
    }

    // 示例3:for 嵌套 while
    cout << "\nfor 嵌套 while:" << endl;
    for (int i = 1; i <= 3; i++)
    {
        int j = 1;
        while (j <= i)
        {
            cout << i << "-" << j << " ";
            j++;
        }
        cout << endl;
    }

    // 示例4:while 嵌套 do...while
    cout << "\nwhile 嵌套 do...while:" << endl;
    int a = 1;
    while (a <= 3)
    {
        int b = 1;
        do
        {
            cout << a << "*" << b << "=" << a * b << " ";
            b++;
        } while (b <= a);
        cout << endl;
        a++;
    }

    // 示例5:打印星号图案(直角三角形)
    cout << "\n星号图案:" << endl;
    for (int row = 1; row <= 5; row++)
    {
        for (int col = 1; col <= row; col++)
        {
            cout << "* ";
        }
        cout << endl;
    }

    // 示例6:打印星号图案(矩形)
    cout << "\n矩形星号图案:" << endl;
    for (int r = 1; r <= 4; r++)
    {
        for (int c = 1; c <= 8; c++)
        {
            cout << "* ";
        }
        cout << endl;
    }

    // 示例7:求 1~10 每个数的阶乘
    cout << "\n1~10 的阶乘:" << endl;
    for (int n = 1; n <= 10; n++)
    {
        int fact = 1;
        for (int k = 1; k <= n; k++)
        {
            fact *= k;
        }
        cout << n << "! = " << fact << endl;
    }

    return 0;
}Code language: PHP (php)

五、注意事项

  • 内层循环必须完整地包含在外层循环的循环体内,不能交叉。
  • 嵌套层次不宜过深,一般不超过 3 层,否则可读性和性能都会下降。
  • 内层循环和外层循环的控制变量不能重名(在同一作用域内),否则会导致逻辑错误。
  • 嵌套循环中,内层循环的初始化语句通常写在内层循环头部,确保每次外层循环执行时内层循环都重新初始化。
  • 嵌套循环的总执行次数 = 外层循环次数 × 内层循环次数。例如外层执行 9 次,内层每次执行 i 次,总次数为 1+2+…+9 = 45 次。

六、常见错误

1. 循环变量重名
for (int i = 1; i <= 5; i++)
{
    for (int i = 1; i <= 3; i++)   // 错误:内层 i 与外层 i 同名
    {
        cout << i << endl;
    }
}Code language: JavaScript (javascript)

虽然在 C++ 中内层作用域可以遮蔽外层变量,但极易造成混淆,应避免。

2. 内层循环缺少大括号
for (int i = 1; i <= 3; i++)
    for (int j = 1; j <= 3; j++)
        cout << i << " " << j << endl;   // 正确,但可读性差
        cout << "done";                  // 这行不在内层循环中Code language: JavaScript (javascript)

建议始终使用大括号明确循环体范围。

3. 循环条件错误导致死循环
for (int i = 1; i <= 5; i++)
{
    for (int j = 1; j >= 1; j++)   // j 始终 >= 1,死循环
    {
        cout << j << endl;
    }
}Code language: JavaScript (javascript)

七、小结

  • 循环嵌套是指一个循环体内包含另一个完整的循环结构。
  • while、do…while、for 三种循环可以任意互相嵌套。
  • 外层循环每执行一次,内层循环完整执行一轮。
  • 嵌套循环常用于处理二维数据、打印图案、多重计算等场景。
  • 嵌套层次不宜过深,循环变量不要重名,内层循环应正确初始化。
  • 下一节将介绍循环控制语句 break 和 continue。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注