快速学C语言——第 6 章:循环结构
第 6 章循环结构在编程中我们经常需要重复执行某些任务。例如计算 1 到 100 的总和、处理数组中的每个元素、打印指定图案或者等待用户输入直到输入正确为止。C 语言提供了强大的循环结构来处理这类重复性任务。循环能够让一段代码重复执行多次直到满足特定条件为止无需手动编写重复代码这大大提高了编程的效率和代码的简洁性。6.1 while 循环while 循环是最基本的循环类型它在每次执行循环体之前检查条件适合 “循环次数不确定仅知道终止条件” 的场景。语法格式while(条件表达式){// 循环体条件为真非0时重复执行的代码块}执行流程计算条件表达式的值。若值为非 0真执行循环体中的代码。循环体执行完毕后返回步骤 1再次检查条件。若值为 0假跳出循环执行循环结构后的代码。示例打印 1 到 5 的数字#includestdio.hintmain(){intcount1;// 初始化计数器循环控制变量// 条件count≤5时继续循环while(count5){printf(当前数字%d\n,count);count;// 更新计数器避免无限循环}printf(循环结束\n);return0;}运行结果当前数字1 当前数字2 当前数字3 当前数字4 当前数字5 循环结束 -------------------------------- Process exited after0.04879seconds withreturnvalue0请按任意键继续...重要提醒必须在循环体内更新循环控制变量如count否则条件永远为真会导致无限循环程序卡死需强制终止。条件表达式可以是关系表达式、逻辑表达式或单个变量 / 常量非 0 为真0 为假。若循环体只有一条语句花括号可省略但不推荐后续扩展代码易出错。6.2 do-while 循环——先执行再判断do-while 循环与 while 循环核心逻辑一致但它先执行一次循环体再检查条件。这意味着无论条件是否成立循环体至少会执行一次适合 “必须执行一次再判断是否继续” 的场景。语法格式do{// 循环体至少执行一次的代码块}while(条件表达式);// 注意末尾的分号不能遗漏执行流程执行一次循环体代码。计算条件表达式的值。若值为非 0真返回步骤 1继续执行循环体。若值为 0假跳出循环。示例要求用户输入 1-100 之间的数字#includestdio.hintmain(){intnumber;// 至少输入一次直到符合范围do{printf(请输入一个1到100之间的数字);scanf(%d,number);}while(number1||number100);// 条件不满足则继续循环printf(你输入的数字是%d\n,number);return0;}运行过程请输入一个1到100之间的数字3566 请输入一个1到100之间的数字1000 请输入一个1到100之间的数字23 你输入的数字是23 -------------------------------- Process exited after8.945seconds withreturnvalue0请按任意键继续...关键注意do-while 循环的条件表达式末尾必须加分号这是语法强制要求遗漏会导致编译错误。6.3 for 循环精确控制的循环for 循环提供了更紧凑的语法将 “循环变量初始化、条件检查、循环变量更新” 三个核心操作集中在一行结构清晰适合 “已知循环次数、需要精确控制” 的场景如遍历数组、固定次数的计算。语法格式for(初始化语句;条件表达式;更新语句){// 循环体条件为真时执行的代码块}执行流程执行初始化语句仅执行一次用于初始化循环控制变量。计算条件表达式非 0真则执行循环体0假则跳出循环。执行循环体代码。执行更新语句通常是循环变量的增减。返回步骤 2重复判断条件。示例打印 1 到 10、计算 1 到 100 的和#includestdio.hintmain(){inti;// 示例1打印1到10计数循环for(i1;i10;i){// 初始化i1i≤10时循环每次i1printf(%d ,i);}printf(\n);// 示例2计算1到100的和循环变量在内部声明C99及以上支持intsum0;for(intj1;j100;j){sumj;// 等价于 sum sum j}printf(1到100的和是%d\n,sum);return0;}运行结果123456789101到100的和是5050 -------------------------------- Process exited after0.05022seconds withreturnvalue0请按任意键继续...for 循环的灵活性倒序循环for (i 10; i 1; i--)从 10 递减到 1。间隔循环for (i 0; i 100; i 10)每次加 10打印 0、10、20…100。省略部分语句分号必须保留省略初始化int i 1; for (; i 5; i)初始化在外部。省略条件for (i 1; ; i)无限循环需在循环体内用 break 终止。省略更新for (i 1; i 5; ) { printf(%d , i); i; }更新在循环体内。多循环变量for (int i 0, j 10; i 10; i, j--)同时控制两个变量。6.4 循环控制语句break 与 continue循环控制语句用于灵活调整循环的执行流程核心有两个break终止循环和 continue跳过本次循环。6.4.1 break 语句立即退出循环break 语句的作用是立即终止当前所在的循环跳出循环体执行循环结构后的代码。若在嵌套循环中仅退出当前层级的循环不影响外层循环。示例输入数字输入 0 则退出#includestdio.hintmain(){intnumber;// 无限循环条件为1永远为真靠break终止while(1){printf(请输入一个数字输入0退出);scanf(%d,number);if(number0){break;// 输入0立即退出while循环}printf(你输入了%d\n,number);}printf(程序结束。\n);return0;}运行过程请输入一个数字输入0退出3 你输入了3 请输入一个数字输入0退出5 你输入了5 请输入一个数字输入0退出0 程序结束。 -------------------------------- Process exited after11.49seconds withreturnvalue0请按任意键继续...6.4.2 continue 语句跳过本次循环continue 语句的作用是跳过当前循环的剩余代码直接进入下一次循环的条件判断或更新步骤。它不会终止循环只是跳过本次迭代。示例打印 1 到 10 之间的奇数#includestdio.hintmain(){inti;for(i1;i10;i){if(i%20){// 若为偶数跳过本次循环continue;}printf(%d ,i);// 仅奇数会执行此语句}printf(\n);return0;}运行结果13579-------------------------------- Process exited after0.0534seconds withreturnvalue0请按任意键继续...break 与 continue 的区别break直接终止循环后续循环不再执行。continue仅跳过本次循环的剩余代码下一次循环正常执行。6.5 嵌套循环循环中的循环在一个循环外层循环的循环体内包含另一个循环内层循环称为嵌套循环。外层循环控制 “行数”内层循环控制 “每行的列数”常用于打印图案、处理二维数组、复杂计算等场景。语法格式以 for 循环嵌套为例for(外层初始化;外层条件;外层更新){// 外层循环体for(内层初始化;内层条件;内层更新){// 内层循环体}}示例打印 5×5 乘法表#includestdio.hintmain(){inti,j;printf(乘法表\n);for(i1;i5;i){// 外层循环控制行数1-5行for(j1;j5;j){// 内层循环控制每行的列数1-5列printf(%d\t,i*j);// 打印乘积\t是制表符保持对齐}printf(\n);// 一行结束后换行}return0;}运行结果乘法表12345246810369121548121620510152025-------------------------------- Process exited after0.05197seconds withreturnvalue0请按任意键继续...嵌套循环的注意事项内层循环会完整执行完所有迭代后外层循环才会进入下一次迭代如上述例子i1 时j 从 1 到 5 完整执行再执行 i2。嵌套层级不宜过多建议≤3 层否则代码可读性差、执行效率低。内层循环的条件通常与外层循环变量相关如打印直角三角形时内层 j≤i。6.6 循环的选择指南循环类型适用场景特点while不确定循环次数依赖某个条件先判断后执行可能一次都不执行do-while至少需要执行一次的情况先执行后判断保证至少执行一次for已知循环次数或需要精确控制结构紧凑适合计数循环选择建议遍历数组、固定次数计算如 1 到 100 求和→ 优先用 for 循环。用户输入验证、必须执行一次的操作如菜单展示→ 用 do-while 循环。等待某个事件发生如等待用户输入特定指令、循环次数不确定 → 用 while 循环。笔记循环的核心三要素循环控制变量、循环条件、循环变量更新缺一不可否则易导致无限循环。无限循环的常见写法while (1)、for (;;)需在循环体内用 break 终止。break 仅退出当前层级的循环continue 仅跳过本次循环二者不影响循环外的代码。嵌套循环中内层循环的执行次数 外层循环次数 × 内层循环次数需避免层级过多。for 循环的循环变量可在内部声明C99 及以上作用域仅限于循环体更规范。优化循环效率减少循环体内的重复计算如将sqrt(num)提前计算并存储避免不必要的操作。