快速学C语言——第 6 章:循环结构
2026/5/10 23:10:39 网站建设 项目流程

第 6 章:循环结构

在编程中,我们经常需要重复执行某些任务。例如,计算 1 到 100 的总和、处理数组中的每个元素、打印指定图案,或者等待用户输入直到输入正确为止。

C 语言提供了强大的循环结构来处理这类重复性任务。循环能够让一段代码重复执行多次,直到满足特定条件为止,无需手动编写重复代码,这大大提高了编程的效率和代码的简洁性。


6.1 while 循环

while 循环是最基本的循环类型,它在每次执行循环体之前检查条件,适合 “循环次数不确定,仅知道终止条件” 的场景。

语法格式:

while(条件表达式){// 循环体:条件为真(非0)时重复执行的代码块}

执行流程:

  1. 计算条件表达式的值。
  2. 若值为非 0(真),执行循环体中的代码。
  3. 循环体执行完毕后,返回步骤 1,再次检查条件。
  4. 若值为 0(假),跳出循环,执行循环结构后的代码。

示例:打印 1 到 5 的数字

#include<stdio.h>intmain(){intcount=1;// 初始化计数器(循环控制变量)// 条件:count≤5时继续循环while(count<=5){printf("当前数字:%d\n",count);count++;// 更新计数器,避免无限循环}printf("循环结束!\n");return0;}

运行结果:

当前数字:1 当前数字:2 当前数字:3 当前数字:4 当前数字:5 循环结束! -------------------------------- Process exited after0.04879seconds withreturnvalue0请按任意键继续...

重要提醒:

  1. 必须在循环体内更新循环控制变量(如count++),否则条件永远为真,会导致无限循环(程序卡死,需强制终止)。
  2. 条件表达式可以是关系表达式、逻辑表达式,或单个变量 / 常量(非 0 为真,0 为假)。
  3. 若循环体只有一条语句,花括号可省略,但不推荐(后续扩展代码易出错)。

6.2 do-while 循环——先执行,再判断

do-while 循环与 while 循环核心逻辑一致,但它先执行一次循环体,再检查条件。这意味着,无论条件是否成立,循环体至少会执行一次,适合 “必须执行一次,再判断是否继续” 的场景。

语法格式:

do{// 循环体:至少执行一次的代码块}while(条件表达式);// 注意末尾的分号不能遗漏

执行流程:

  1. 执行一次循环体代码。
  2. 计算条件表达式的值。
  3. 若值为非 0(真),返回步骤 1,继续执行循环体。
  4. 若值为 0(假),跳出循环。

示例:要求用户输入 1-100 之间的数字

#include<stdio.h>intmain(){intnumber;// 至少输入一次,直到符合范围do{printf("请输入一个1到100之间的数字:");scanf("%d",&number);}while(number<1||number>100);// 条件不满足则继续循环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(初始化语句;条件表达式;更新语句){// 循环体:条件为真时执行的代码块}

执行流程:

  1. 执行初始化语句(仅执行一次,用于初始化循环控制变量)。
  2. 计算条件表达式:非 0(真)则执行循环体,0(假)则跳出循环。
  3. 执行循环体代码。
  4. 执行更新语句(通常是循环变量的增减)。
  5. 返回步骤 2,重复判断条件。

示例:打印 1 到 10、计算 1 到 100 的和

#include<stdio.h>intmain(){inti;// 示例1:打印1到10(计数循环)for(i=1;i<=10;i++){// 初始化i=1;i≤10时循环;每次i+1printf("%d ",i);}printf("\n");// 示例2:计算1到100的和(循环变量在内部声明,C99及以上支持)intsum=0;for(intj=1;j<=100;j++){sum+=j;// 等价于 sum = sum + j}printf("1到100的和是:%d\n",sum);return0;}

运行结果:

123456789101到100的和是:5050 -------------------------------- Process exited after0.05022seconds withreturnvalue0请按任意键继续...

for 循环的灵活性:

  1. 倒序循环:for (i = 10; i >= 1; i--)(从 10 递减到 1)。
  2. 间隔循环:for (i = 0; i <= 100; i += 10)(每次加 10,打印 0、10、20…100)。
  3. 省略部分语句(分号必须保留):
    • 省略初始化:int i = 1; for (; i <= 5; i++)(初始化在外部)。
    • 省略条件:for (i = 1; ; i++)(无限循环,需在循环体内用 break 终止)。
    • 省略更新:for (i = 1; i <= 5; ) { printf("%d ", i); i++; }(更新在循环体内)。
  4. 多循环变量:for (int i = 0, j = 10; i <= 10; i++, j--)(同时控制两个变量)。

6.4 循环控制语句:break 与 continue

循环控制语句用于灵活调整循环的执行流程,核心有两个:break(终止循环)和 continue(跳过本次循环)。

6.4.1 break 语句:立即退出循环

break 语句的作用是立即终止当前所在的循环,跳出循环体,执行循环结构后的代码。若在嵌套循环中,仅退出当前层级的循环,不影响外层循环。

示例:输入数字,输入 0 则退出

#include<stdio.h>intmain(){intnumber;// 无限循环(条件为1,永远为真),靠break终止while(1){printf("请输入一个数字(输入0退出):");scanf("%d",&number);if(number==0){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 之间的奇数

#include<stdio.h>intmain(){inti;for(i=1;i<=10;i++){if(i%2==0){// 若为偶数,跳过本次循环continue;}printf("%d ",i);// 仅奇数会执行此语句}printf("\n");return0;}

运行结果:

13579-------------------------------- Process exited after0.0534seconds withreturnvalue0请按任意键继续...

break 与 continue 的区别:

  • break:直接终止循环,后续循环不再执行。
  • continue:仅跳过本次循环的剩余代码,下一次循环正常执行。

6.5 嵌套循环:循环中的循环

在一个循环(外层循环)的循环体内,包含另一个循环(内层循环),称为嵌套循环。外层循环控制 “行数”,内层循环控制 “每行的列数”,常用于打印图案、处理二维数组、复杂计算等场景。

语法格式(以 for 循环嵌套为例):

for(外层初始化;外层条件;外层更新){// 外层循环体for(内层初始化;内层条件;内层更新){// 内层循环体}}

示例:打印 5×5 乘法表

#include<stdio.h>intmain(){inti,j;printf("乘法表:\n");for(i=1;i<=5;i++){// 外层循环:控制行数(1-5行)for(j=1;j<=5;j++){// 内层循环:控制每行的列数(1-5列)printf("%d\t",i*j);// 打印乘积,\t是制表符,保持对齐}printf("\n");// 一行结束后换行}return0;}

运行结果:

乘法表:12345246810369121548121620510152025-------------------------------- Process exited after0.05197seconds withreturnvalue0请按任意键继续...

嵌套循环的注意事项:

  1. 内层循环会完整执行完所有迭代后,外层循环才会进入下一次迭代(如上述例子,i=1 时,j 从 1 到 5 完整执行,再执行 i=2)。
  2. 嵌套层级不宜过多(建议≤3 层),否则代码可读性差、执行效率低。
  3. 内层循环的条件通常与外层循环变量相关(如打印直角三角形时,内层 j≤i)。

6.6 循环的选择指南

循环类型适用场景特点
while不确定循环次数,依赖某个条件先判断,后执行,可能一次都不执行
do-while至少需要执行一次的情况先执行,后判断,保证至少执行一次
for已知循环次数或需要精确控制结构紧凑,适合计数循环

选择建议:

  1. 遍历数组、固定次数计算(如 1 到 100 求和)→ 优先用 for 循环。
  2. 用户输入验证、必须执行一次的操作(如菜单展示)→ 用 do-while 循环。
  3. 等待某个事件发生(如等待用户输入特定指令)、循环次数不确定 → 用 while 循环。

笔记

  1. 循环的核心三要素:循环控制变量、循环条件、循环变量更新,缺一不可(否则易导致无限循环)。
  2. 无限循环的常见写法:while (1)for (;;),需在循环体内用 break 终止。
  3. break 仅退出当前层级的循环,continue 仅跳过本次循环,二者不影响循环外的代码。
  4. 嵌套循环中,内层循环的执行次数 = 外层循环次数 × 内层循环次数,需避免层级过多。
  5. for 循环的循环变量可在内部声明(C99 及以上),作用域仅限于循环体,更规范。
  6. 优化循环效率:减少循环体内的重复计算(如将sqrt(num)提前计算并存储),避免不必要的操作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询