一、什么是循环在 C 程序中很多时候我们需要让一段代码重复执行。比如打印 1 到 100 的数字统计数组中所有元素的和不断读取用户输入直到输入某个特定值遍历字符串、数组、vector 等容器。如果不用循环我们可能要写很多重复代码cout 1 endl; cout 2 endl; cout 3 endl; cout 4 endl; cout 5 endl;这样写不仅麻烦而且不灵活。如果要打印 1 到 10000就几乎不现实了。这时候就需要使用循环语句。循环的核心作用就是在满足某个条件的情况下重复执行一段代码。C 中常见的循环结构主要有while循环、do...while循环、for循环以及嵌套循环。菜鸟教程中也将这些作为 C 循环的主要类型进行介绍并补充了break、continue、goto等循环控制语句。(runoob.com)二、while 循环1. 基本语法while (条件表达式) { 循环体; }执行流程是先判断条件表达式如果条件为true执行循环体执行完循环体后再次判断条件只要条件一直为true循环就会一直执行当条件变为false时循环结束。2. 示例输出 1 到 5#include iostream using namespace std; int main() { int i 1; while (i 5) { cout i endl; i; } return 0; }输出结果1 2 3 4 53. 执行过程分析int i 1;一开始i的值是 1。第一次判断i 5也就是1 5条件成立输出 1然后执行i;此时i变成 2。接着继续判断2 5成立输出 2。循环不断执行直到i变成 6此时6 5条件不成立循环结束。4. while 循环的特点while循环适合用于循环次数不一定明确的情况。例如不断读取用户输入不断判断某个条件是否满足只要条件成立就继续执行。示例#include iostream using namespace std; int main() { int num; cout 请输入一个数字输入 0 结束 endl; cin num; while (num ! 0) { cout 你输入的是 num endl; cin num; } cout 程序结束 endl; return 0; }这个程序会一直让用户输入数字直到用户输入0为止。三、do...while 循环1. 基本语法do { 循环体; } while (条件表达式);do...while和while的最大区别是do...while会先执行一次循环体然后再判断条件。也就是说无论条件一开始是否成立do...while的循环体至少会执行一次。2. 示例输出 1 到 5#include iostream using namespace std; int main() { int i 1; do { cout i endl; i; } while (i 5); return 0; }输出结果1 2 3 4 53. do...while 至少执行一次看下面这个例子#include iostream using namespace std; int main() { int i 10; do { cout 当前 i 的值是 i endl; i; } while (i 5); return 0; }输出结果当前 i 的值是10虽然一开始i 5这个条件就是假的但是程序仍然执行了一次循环体。这就是do...while的特点。4. do...while 适合什么场景do...while适合用于至少需要执行一次的场景。例如菜单选择用户登录输入校验游戏主循环。示例简单菜单程序#include iostream using namespace std; int main() { int choice; do { cout 菜单 endl; cout 1. 开始游戏 endl; cout 2. 查看说明 endl; cout 0. 退出程序 endl; cout 请输入你的选择; cin choice; if (choice 1) { cout 游戏开始 endl; } else if (choice 2) { cout 这里是游戏说明。 endl; } else if (choice 0) { cout 程序退出。 endl; } else { cout 输入无效请重新输入。 endl; } } while (choice ! 0); return 0; }在这个例子中菜单至少要显示一次所以使用do...while很合适。四、for 循环1. 基本语法for (初始化语句; 条件表达式; 更新语句) { 循环体; }for循环通常用于循环次数比较明确的情况。例如输出 1 到 100遍历数组遍历字符串执行固定次数的操作。2. for 循环执行流程for (int i 1; i 5; i) { cout i endl; }执行顺序如下第一步执行初始化语句int i 1;第二步判断条件i 5;第三步如果条件成立执行循环体cout i endl;第四步执行更新语句i;第五步回到第二步继续判断条件。3. 示例输出 1 到 5#include iostream using namespace std; int main() { for (int i 1; i 5; i) { cout i endl; } return 0; }输出结果1 2 3 4 54. 示例计算 1 到 100 的和#include iostream using namespace std; int main() { int sum 0; for (int i 1; i 100; i) { sum i; } cout 1 到 100 的和是 sum endl; return 0; }输出结果1 到 100 的和是50505. for 循环适合遍历数组#include iostream using namespace std; int main() { int arr[5] {10, 20, 30, 40, 50}; for (int i 0; i 5; i) { cout arr[i] endl; } return 0; }输出结果10 20 30 40 50数组下标从0开始所以这里的循环条件是i 5而不是i 5如果写成i 5就会访问arr[5]造成数组越界。五、while、do...while、for 的区别循环类型判断条件的位置是否至少执行一次适用场景while循环开始前不一定循环次数不确定do...while循环结束后是至少执行一次的场景for循环开始前不一定循环次数明确简单来说如果循环次数明确优先考虑for如果循环次数不明确优先考虑while如果循环体至少要执行一次使用do...while。六、嵌套循环1. 什么是嵌套循环嵌套循环就是在一个循环里面再写一个循环。例如for (int i 1; i 3; i) { for (int j 1; j 3; j) { cout i j endl; } }外层循环每执行一次内层循环都会完整执行一遍。2. 示例输出 3 行 5 列的星号#include iostream using namespace std; int main() { for (int i 1; i 3; i) { for (int j 1; j 5; j) { cout *; } cout endl; } return 0; }输出结果***** ***** *****分析外层循环控制行数内层循环控制每一行输出多少个星号。3. 示例输出直角三角形#include iostream using namespace std; int main() { for (int i 1; i 5; i) { for (int j 1; j i; j) { cout *; } cout endl; } return 0; }输出结果* ** *** **** *****这里的关键在于j i当i 1时输出 1 个星号当i 2时输出 2 个星号当i 3时输出 3 个星号以此类推。4. 示例九九乘法表#include iostream #include iomanip using namespace std; int main() { for (int i 1; i 9; i) { for (int j 1; j i; j) { cout j * i setw(2) i * j ; } cout endl; } return 0; }输出结果1 * 1 1 1 * 2 2 2 * 2 4 1 * 3 3 2 * 3 6 3 * 3 9 1 * 4 4 2 * 4 8 3 * 4 12 4 * 4 16 ...在这个程序中外层循环i控制行内层循环j控制列setw(2)用来控制输出宽度让结果更整齐。七、break 语句1. break 的作用break的作用是立即结束当前循环。只要程序执行到break当前循环就会被终止。菜鸟教程中也说明break可以终止循环或switch语句程序会继续执行循环或switch后面的语句。(runoob.com)2. 示例遇到 5 就停止循环#include iostream using namespace std; int main() { for (int i 1; i 10; i) { if (i 5) { break; } cout i endl; } return 0; }输出结果1 2 3 4当i 5时执行break整个循环立即结束所以 5 不会被输出。3. break 在嵌套循环中的作用#include iostream using namespace std; int main() { for (int i 1; i 3; i) { for (int j 1; j 3; j) { if (j 2) { break; } cout i i , j j endl; } } return 0; }输出结果i 1, j 1 i 2, j 1 i 3, j 1注意break只会结束它所在的那一层循环。在这个例子中break只结束内层循环不会结束外层循环。八、continue 语句1. continue 的作用continue的作用是跳过本次循环中剩下的代码直接进入下一次循环。菜鸟教程中对continue的解释是它会让循环跳过循环体剩余部分重新开始测试条件。(runoob.com)2. 示例跳过数字 5#include iostream using namespace std; int main() { for (int i 1; i 10; i) { if (i 5) { continue; } cout i endl; } return 0; }输出结果1 2 3 4 6 7 8 9 10当i 5时执行continue跳过本次输出所以 5 不会被打印。但是循环并没有结束而是继续执行后面的 6、7、8、9、10。九、break 和 continue 的区别语句作用是否结束整个循环break直接结束当前循环是continue跳过本次循环进入下一次循环否举个简单的比喻break是“不干了整个循环结束”continue是“这一次跳过下一次继续”。十、无限循环1. 什么是无限循环如果循环条件一直为真循环就不会结束这种情况叫做无限循环。例如while (true) { cout hello endl; }这段代码会一直输出hello除非程序被强制终止。2. for 写法的无限循环for (;;) { cout 这是一个无限循环 endl; }在 C 中for循环的三个表达式都可以省略因此for(;;)经常被用来表示无限循环。菜鸟教程中也提到当条件表达式不存在时通常会被视为真很多 C 程序员会使用for(;;)表示无限循环。(runoob.com)3. 无限循环的实际使用无限循环并不一定是错误有时候它是有用的。例如服务器程序、游戏主循环、菜单系统中程序需要不断运行直到用户选择退出。#include iostream using namespace std; int main() { int choice; while (true) { cout 1. 继续 endl; cout 0. 退出 endl; cout 请输入选择; cin choice; if (choice 0) { break; } cout 程序继续运行... endl; } cout 程序结束 endl; return 0; }这里使用了无限循环但是通过break控制退出。十一、循环中常见错误1. 忘记更新循环变量错误示例int i 1; while (i 5) { cout i endl; }这个程序会一直输出 1因为i的值一直没有变化。正确写法int i 1; while (i 5) { cout i endl; i; }2. 条件写错导致循环次数异常错误示例for (int i 1; i 5; i) { cout i endl; }如果你的目标是输出 1 到 5那么这个条件写错了。它只会输出1 2 3 4正确写法for (int i 1; i 5; i) { cout i endl; }3. 数组越界错误示例int arr[5] {10, 20, 30, 40, 50}; for (int i 0; i 5; i) { cout arr[i] endl; }数组arr的合法下标是0, 1, 2, 3, 4但是i 5会访问到arr[5]这是越界访问。正确写法for (int i 0; i 5; i) { cout arr[i] endl; }4. 分号位置错误错误示例for (int i 1; i 5; i); { cout hello endl; }这里for后面多了一个分号for (int i 1; i 5; i);这个分号会让循环体变成空语句后面的代码块只会执行一次。正确写法for (int i 1; i 5; i) { cout hello endl; }十二、综合案例统计学生成绩需求输入 5 名学生的成绩计算总分和平均分。#include iostream using namespace std; int main() { int score; int sum 0; for (int i 1; i 5; i) { cout 请输入第 i 名学生的成绩; cin score; sum score; } double average sum / 5.0; cout 总分是 sum endl; cout 平均分是 average endl; return 0; }这个案例中循环执行了 5 次每次输入一个学生成绩并将成绩累加到sum中。十三、综合案例判断一个数是否为素数素数是指只能被 1 和它本身整除的正整数。例如2、3、5、7、11 是素数4、6、8、9、10 不是素数。代码如下#include iostream using namespace std; int main() { int n; bool isPrime true; cout 请输入一个整数; cin n; if (n 1) { isPrime false; } else { for (int i 2; i n; i) { if (n % i 0) { isPrime false; break; } } } if (isPrime) { cout n 是素数 endl; } else { cout n 不是素数 endl; } return 0; }这段代码中for循环用于尝试寻找n的因数如果找到某个i可以整除n说明n不是素数此时使用break直接结束循环提高效率。十四、总结C 中的循环语句是程序控制结构中非常重要的一部分。本文主要介绍了以下内容while循环适合循环次数不确定的场景do...while循环适合至少执行一次的场景for循环适合循环次数明确的场景嵌套循环适合处理二维结构、图形输出、乘法表等问题break用于直接结束当前循环continue用于跳过本次循环继续下一次循环无限循环在菜单、服务器、游戏循环等场景中经常使用。对于初学者来说掌握循环的关键不是死记语法而是理解三个问题第一循环从哪里开始第二循环什么时候结束第三每次循环之后变量如何变化只要把这三个问题想清楚循环结构就会变得非常容易理解。参考资料本文结构参考了菜鸟教程中对 C 循环类型、循环控制语句和无限循环的基础介绍并在此基础上重新整理、扩展了示例和讲解。(runoob.com)