一、循环嵌套的概念
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内层的循环可以再嵌套更内层的循环,形成多层嵌套。
while、do…while 和 for 三种循环语句可以互相嵌套,即 for 循环中可以有 while 循环,while 循环中也可以有 for 循环,没有限制。
二、循环嵌套的执行流程
外层循环每执行一次,内层循环就完整地执行一轮(从初始化到结束)。
以两层嵌套为例:
- 外层循环执行第 1 次 → 进入循环体 → 内层循环从头到尾完整执行一遍 → 回到外层循环判断条件。
- 外层循环执行第 2 次 → 内层循环再次从头到尾完整执行一遍。
- 以此类推,直到外层循环条件为 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。
Previous: 循环结构-for语句
Next: 循环结构与选择结构相互嵌套