C++ 核心知识点汇总(第四日)(循环结构)
引言
循环结构是程序的"效率引擎",用于处理重复执行的逻辑(如遍历、累加、图形打印等),是从"顺序执行"到"批量处理"的关键一步。
一、循环结构核心基础
1. 什么是循环?
程序重复执行一段代码(循环体),直到满足终止条件,核心作用是减少重复代码、提高效率。
2. 三种循环的对比(高频考点)
| 循环类型 | 语法结构 | 执行流程 | 适用场景 | 核心特点 |
|---|---|---|---|---|
for |
for(初始化; 条件; 增量) { 循环体 } |
初始化 → 判断条件 → 执行循环体 → 增量 → 重复判断 | 循环次数明确的场景(如遍历0-99的数) | 初始化、条件、增量集中在一行,结构清晰 |
while |
while(条件) { 循环体 } |
判断条件 → 执行循环体 → 重复判断 | 循环次数不明确,但终止条件明确的场景(如读取输入直到遇到特定字符) | 条件在前,可能一次都不执行 |
do-while |
do { 循环体 } while(条件); |
执行循环体 → 判断条件 → 重复执行 | 循环体必须至少执行一次的场景(如菜单选择,必须先显示菜单再判断是否退出) | 循环体在前,至少执行一次 |
二、三种循环的语法与执行流程
1. for 循环:次数明确的"标准化循环"
语法与执行步骤
cpp
for (初始化表达式; 条件表达式; 增量表达式) {
// 循环体(条件为真时执行)
}
- 初始化 :仅执行一次,通常用于初始化循环变量(如
int i = 0); - 条件判断:若为真,执行循环体;若为假,退出循环;
- 增量更新 :循环体执行后,更新循环变量(如
i++); - 重复步骤2-3,直到条件为假。
核心示例(真题高频:0-100偶数求和)
cpp
int sum = 0;
for (int i = 0; i <= 100; i += 2) {
sum += i;
}
cout << sum; // 输出:2550
真题坑点:循环变量的作用域
for 循环中初始化的变量(如 int i)仅在循环体内有效,外部无法访问。
真题坑点:浮点数循环条件的精度问题
cpp
// 错误:浮点数精度误差导致循环次数不确定
for (double i = 0; i < 1.0; i += 0.1) {
cout << i << " ";
}
// 建议:用整数控制循环次数,再转换为浮点数
for (int i = 0; i < 10; i++) {
double x = i * 0.1;
cout << x << " ";
}
2. while 循环:条件驱动的"灵活循环"
语法与执行步骤
cpp
while (条件表达式) {
// 循环体(条件为真时执行)
}
- 条件判断:若为真,执行循环体;若为假,退出循环;
- 重复步骤1,直到条件为假。
核心示例(真题高频:求正整数各位数字之和)
cpp
int N, tnt = 0;
cin >> N;
while (N != 0) {
tnt += N % 10; // 取最后一位数字
N /= 10; // 去掉最后一位
}
cout << tnt; // 输入123 → 输出6
真题坑点:循环变量未初始化
cpp
int tnt; // 未初始化,值为随机数
for (int i = 0; i < 10; i++)
tnt += i;
cout << tnt; // 输出不确定的值(高频错题)
3. do-while 循环:必须执行一次的"保底循环"
语法与执行步骤
cpp
do {
// 循环体(至少执行一次)
} while (条件表达式);
- 执行循环体:无条件执行一次;
- 条件判断:若为真,重复执行循环体;若为假,退出循环。
核心示例(真题高频:菜单选择)
cpp
int choice;
do {
cout << "1. 开始游戏\n2. 退出\n请选择:";
cin >> choice;
} while (choice != 2); // 直到选择退出才结束
真题考点:do-while 至少执行一次
判断题:
do-while语句的循环体至少会执行一次 ✅ 正确
三、循环控制语句:break / continue / return(核心考点)
循环控制语句用于改变循环的执行流程,是考试中最易出错的部分。
1. break:终止当前层次的循环/switch
- 作用 :跳出当前所在的循环或
switch语句,后续代码不再执行; - 多层循环中 :仅跳出当前层次的循环(如内层循环的
break不会影响外层循环); - 真题示例:
cpp
for (int i = 5; i < 100; i += 5) {
if (i % 2 == 0) continue;
tnt += 1;
if (i % 3 == 0 && i % 7 == 0) break; // 遇到21时终止循环
}
// 执行到i=21时,tnt=10(i=5,15,25,35,45,55,65,75,85,95共10个奇数,第11个i=21触发break)
2. continue:跳过本次循环,进入下一次判断
- 作用 :跳过当前循环体中
continue之后的代码,直接进入下一次循环条件判断; - 注意:不会终止循环,只是跳过本次循环的剩余语句;
- 真题示例:
cpp
for (int i = 0; i < 10; i++) {
if (i % 3) continue; // 非3的倍数跳过
printf("0#"); // 仅i=0,3,6,9时执行
}
// 输出:0#0#0#0#
3. return:直接终止函数执行
- 作用 :退出当前函数(包括
main函数),不仅终止循环,还会终止整个函数; - 真题示例:
cpp
for (int i = 0; i <= 10; i++) {
if (i == 5) return 0; // 直接退出main函数,后续代码不再执行
cout << i;
}
// 输出:01234(i=5时退出)
4. 循环控制语句对比表
| 语句 | 作用范围 | 终止循环? | 多层循环行为 |
|---|---|---|---|
break |
当前层次的循环/switch | 是 | 仅跳出当前层次 |
continue |
当前循环的本次迭代 | 否 | 仅跳过本次迭代 |
return |
整个函数 | 是 | 直接退出函数,所有循环终止 |
四、多层循环:嵌套循环的执行与应用
1. 什么是多层循环?
一个循环体内包含另一个完整的循环结构,常见于二维场景(如打印图形、遍历二维数组、组合计数)。
执行顺序:外层循环执行一次,内层循环执行一轮
cpp
// 示例:打印3行4列的星号
for (int i = 0; i < 3; i++) { // 外层循环:控制行数
for (int j = 0; j < 4; j++) { // 内层循环:控制列数
cout << "*";
}
cout << endl;
}
// 输出:
// ****
// ****
// ****
2. 高频实战场景(真题必背)
场景1:打印金字塔图形(高频考点)
cpp
int height = 5;
for (int i = 0; i < height; i++) {
// 打印前面的空格:每行空格数 = height - i - 1
for (int j = 0; j < height - i - 1; j++) {
cout << " ";
}
// 打印星号:每行星号数 = 2 * i + 1
for (int k = 0; k < 2 * i + 1; k++) {
cout << "*";
}
cout << endl;
}
// 输出:
// *
// ***
// *****
// *******
// *********
场景2:九九乘法表(高频考点)
cpp
for (int hang = 1; hang < 10; hang++) { // 外层:控制行数
for (int lie = 1; lie < hang + 1; lie++) { // 内层:控制列数
printf("%d*%d=%d ", lie, hang, lie * hang);
}
printf("\n");
}
// 输出:
// 1*1=1
// 1*2=2 2*2=4
// 1*3=3 2*3=6 3*3=9
// ...
3. 多层循环优化技巧
- 减少内层循环次数 :通过数学推导缩小内层循环的范围(如场景3中
y >= x、z >= y减少无效遍历); - 避免重复计算 :将内层循环中不变的计算移到外层(如
height - i - 1可在外层计算后存储); - 及时终止循环 :在内层循环中使用
break提前终止无效迭代。
六、实战场景与真题解析(必背)
1. 场景1:阶乘求和(真题高频)
cpp
int N;
cin >> N;
int tnt = 0, nowNum = 1;
for (int i = 1; i < N + 1; i++) {
nowNum *= i; // 计算当前i的阶乘
tnt += nowNum; // 累加阶乘
}
cout << tnt; // 输入3 → 输出:1!+2!+3!=1+2+6=9
2. 场景2:判断位增数(真题高频)
cpp
int N;
cin >> N;
int n2 = N % 10; // 先取最后一位
N /= 10;
while (N) {
int n1 = N % 10;
if (n1 >= n2) { // 前一位 >= 后一位,不是位增数
cout << 0;
return 1;
}
n2 = n1;
N /= 10;
}
cout << 1; // 输入123 → 输出:1
3. 场景3:输出能被7整除但不能被3整除的数(真题高频)
cpp
for (int i = 0; i <= 100; i++) {
if (i % 7 == 0 && i % 3 != 0) {
cout << i << endl;
}
}
// 等价写法:!(i % 7) && i % 3 != 0 或 i % 7 == 0 && !(i % 3 == 0)
// 错误写法:i % 7 && i % 3(表示i不能被7整除且不能被3整除)
总结
- 三种循环的核心区别在于执行时机 :
for次数明确,while条件在前,do-while至少执行一次; - 循环控制语句中,
break终止当前循环,continue跳过本次迭代,return直接退出函数; - 多层循环的执行顺序是"外层一次,内层一轮",常见于图形打印、组合计数等二维场景;
- 常见坑点包括循环变量未初始化、死循环、
continue/break误用、循环条件错误,需重点防范; - 选择循环时,优先考虑业务场景:次数明确用
for,条件明确用while,必须执行一次用do-while。