C++ 核心知识点汇总(第四日)(循环结构)

C++ 核心知识点汇总(第四日)(循环结构)

引言

循环结构是程序的"效率引擎",用于处理重复执行的逻辑(如遍历、累加、图形打印等),是从"顺序执行"到"批量处理"的关键一步。


一、循环结构核心基础

1. 什么是循环?

程序重复执行一段代码(循环体),直到满足终止条件,核心作用是减少重复代码、提高效率

2. 三种循环的对比(高频考点)

循环类型 语法结构 执行流程 适用场景 核心特点
for for(初始化; 条件; 增量) { 循环体 } 初始化 → 判断条件 → 执行循环体 → 增量 → 重复判断 循环次数明确的场景(如遍历0-99的数) 初始化、条件、增量集中在一行,结构清晰
while while(条件) { 循环体 } 判断条件 → 执行循环体 → 重复判断 循环次数不明确,但终止条件明确的场景(如读取输入直到遇到特定字符) 条件在前,可能一次都不执行
do-while do { 循环体 } while(条件); 执行循环体 → 判断条件 → 重复执行 循环体必须至少执行一次的场景(如菜单选择,必须先显示菜单再判断是否退出) 循环体在前,至少执行一次

二、三种循环的语法与执行流程

1. for 循环:次数明确的"标准化循环"

语法与执行步骤
cpp 复制代码
for (初始化表达式; 条件表达式; 增量表达式) {
    // 循环体(条件为真时执行)
}
  1. 初始化 :仅执行一次,通常用于初始化循环变量(如 int i = 0);
  2. 条件判断:若为真,执行循环体;若为假,退出循环;
  3. 增量更新 :循环体执行后,更新循环变量(如 i++);
  4. 重复步骤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. 条件判断:若为真,执行循环体;若为假,退出循环;
  2. 重复步骤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 (条件表达式);
  1. 执行循环体:无条件执行一次;
  2. 条件判断:若为真,重复执行循环体;若为假,退出循环。
核心示例(真题高频:菜单选择)
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 >= xz >= 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整除)

总结

  1. 三种循环的核心区别在于执行时机for 次数明确,while 条件在前,do-while 至少执行一次;
  2. 循环控制语句中,break 终止当前循环,continue 跳过本次迭代,return 直接退出函数;
  3. 多层循环的执行顺序是"外层一次,内层一轮",常见于图形打印、组合计数等二维场景;
  4. 常见坑点包括循环变量未初始化、死循环、continue/break 误用、循环条件错误,需重点防范;
  5. 选择循环时,优先考虑业务场景:次数明确用 for,条件明确用 while,必须执行一次用 do-while
相关推荐
Smart-Space2 小时前
cpphtmlbuilder-c++灵活构造html
c++·html
落羽的落羽2 小时前
【Linux系统】文件IO:理解文件描述符、重定向、缓冲区
linux·服务器·开发语言·数据结构·c++·人工智能·机器学习
sin_hielo2 小时前
leetcode 3637
数据结构·算法·leetcode
仍然.2 小时前
算法题目---双指针算法
数据结构·算法·排序算法
2401_841495642 小时前
【LeetCode刷题】翻转二叉树
python·算法·leetcode··递归·节点·翻转二叉树
嵌入小生0072 小时前
数据结构与算法 | 完全二叉树的实现、哈希表的实现
linux·c语言·数据结构·算法·vim·嵌入式
渡我白衣2 小时前
无中生有——无监督学习的原理、算法与结构发现
人工智能·深度学习·神经网络·学习·算法·机器学习·语音识别
.小墨迹2 小时前
apollo中速度规划的s-t图讲解【针对借道超车的问题】
开发语言·数据结构·c++·人工智能·学习
小龙报2 小时前
【数据结构与算法】单链表的综合运用:1.合并两个有序链表 2.分割链表 3.环形链表的约瑟夫问题
c语言·开发语言·数据结构·c++·算法·leetcode·链表