摘要
本文全面介绍了 C 语言中 while 和 do-while 循环的语法、执行逻辑、适用场景及常见用法。主要内容包括:
- while 循环:适用于循环次数未知、仅知停止条件的场景,遵循“先判断后执行”原则,需注意避免因缺少更新语句导致的死循环。
- do-while 循环:while 循环的变种,特点是“先执行后判断”,循环体至少执行一次,适合菜单程序、输入验证等场景。
- 循环选择指南:for 循环适合已知循环次数;while 循环适合未知次数但知停止条件;do-while 循环适合至少执行一次的场景。三者功能等价,可互相改写。
- 死循环:介绍了 while(1)、for(;😉 等写法,并展示了故意使用死循环的典型场景(如菜单程序)。
- 实战场景:通过用户输入验证、猜数字游戏、累加求和三个示例,演示了 while/do-while 在实际编程中的应用。
- 常见坑点:总结了忘记更新语句、do-while 漏写分号、while 后误加分号、条件写反、浮点数作循环条件等五大常见错误及规避方法。
- 课后练习:提供了 5 道练习题,帮助巩固 while/do-while 循环的编程技能。
掌握 while 和 do-while 循环,能让你在循环次数不确定或需要至少执行一次的场景下编写更简洁、自然的代码。
一、既然有了 for,为什么还要学 while?
上节课我们学了 for 循环,它确实很好用。但有些场景下,用 while 循环会更合适、更自然。
举个例子:
- 你知道要循环多少次 → 用 for 循环(比如打印 100 遍、循环 5 次)
- 你不知道要循环多少次,只知道满足什么条件就停下来 → 用 while 循环更合适
比如:“一直输入数字,直到输入 0 就停止”。你不知道用户会输入几个数字,只知道遇到 0 就停。这种场景用 while 写起来就很舒服。
二、while 循环基本语法
语法格式
while (条件) {
// 循环体:要重复执行的代码
}
while 循环的意思就是:当条件成立时,就一直执行循环体里的代码。
执行顺序
- 第 1 步:判断条件是否成立
- 第 2 步:如果成立,执行循环体;如果不成立,直接结束循环
- 第 3 步:执行完循环体后,回到第 1 步,继续判断条件
……就这样循环往复。
💡 口诀:先判断,后执行。条件成立才循环。
简单示例:打印 1 到 10
#include <stdio.h>
int main()
{
int i = 1; // 初始化
while (i <= 10) { // 循环条件
printf("%d ", i);
i++; // 更新(一定要有!不然会死循环)
}
printf("\n循环结束\n");
return 0;
}
💡 运行结果:1 2 3 4 5 6 7 8 9 10 循环结束
⚠️ 重要提醒:while 循环里一定要有让条件变成假的代码!也就是要有“更新”的步骤。不然条件永远成立,就变成死循环了,程序会一直跑一直跑,停不下来。
while 和 for 的对比
其实 while 循环和 for 循环是可以互相改写的。for 循环的三要素(初始化、条件、更新),while 循环也都有,只是位置不一样:
// for 循环写法
for (i = 1; i <= 10; i++) {
printf("%d ", i);
}
// while 循环写法
i = 1; // 初始化放外面
while (i <= 10) { // 条件放这里
printf("%d ", i);
i++; // 更新放循环体里
}
💡 你看,是不是一一对应的?两种循环其实能干一样的事,只是写法不同。
三、do-while 循环:先斩后奏
do-while 循环是 while 循环的“变种”。它和 while 的区别是:while 是先判断再执行,do-while 是先执行再判断。
也就是说,do-while 循环的循环体至少会执行一次!
语法格式
do {
// 循环体:要重复执行的代码
} while (条件); // 注意:这里有个分号!
执行顺序
- 第 1 步:先执行一次循环体(不管条件咋样,先干了再说)
- 第 2 步:判断条件是否成立
- 第 3 步:如果成立,继续执行循环体;如果不成立,结束循环
- 第 4 步:执行完循环体后,回到第 2 步,继续判断
……就这样循环往复。
💡 口诀:先执行,后判断。至少执行一次。
简单示例
#include <stdio.h>
int main()
{
int i = 1;
do {
printf("%d ", i);
i++;
} while (i <= 10); // 这里有分号!别忘了!
printf("\n循环结束\n");
return 0;
}
💡 运行结果:1 2 3 4 5 6 7 8 9 10 循环结束。看起来和 while 好像一样?那区别在哪呢?
区别演示:条件一开始就不成立
#include <stdio.h>
int main()
{
int i = 100;
printf("while 循环的情况:\n");
while (i <= 10) {
printf("%d ", i);
i++;
}
printf("(while 循环结束,一次都没执行)\n\n");
printf("do-while 循环的情况:\n");
i = 100;
do {
printf("%d ", i);
i++;
} while (i <= 10);
printf("(do-while 循环结束,执行了一次)\n");
return 0;
}
💡 运行结果:
while 循环的情况:
(while 循环结束,一次都没执行)
do-while 循环的情况:
100 (do-while 循环结束,执行了一次)
⚠️ 划重点:while 循环可能一次都不执行,do-while 循环至少执行一次!这是它们最核心的区别。
四、三种循环怎么选?
现在我们学了三种循环:for、while、do-while。很多同学会纠结:我到底该用哪个?
-
for 循环 —— 知道循环次数时首选
- 适合场景:明确知道要循环多少次
- 比如:打印 100 遍、循环 5 次、遍历数组
- 优点:三要素写在一起,结构清晰,不容易漏写更新
-
while 循环 —— 不知道循环次数时首选
- 适合场景:不知道要循环多少次,只知道停止条件
- 比如:一直输入直到遇到 0、一直读文件直到读完
- 优点:写法简洁,读起来像“当……的时候就循环”,很自然
-
do-while 循环 —— 至少要执行一次时用
- 适合场景:循环体至少要执行一次的情况
- 比如:菜单程序(先显示菜单,再判断要不要继续)、输入验证
- 优点:保证至少执行一次
- 缺点:用得相对少一些,很多场景用 while 也能实现
💡 其实三种循环在功能上是等价的,都能互相改写。选哪个主要看哪个写起来更顺手、更易读。
五、死循环(无限循环)
什么是死循环?就是条件永远成立,循环永远停不下来。
死循环一般是 bug,是我们要避免的。但有时候,我们也会故意写死循环,然后在循环体里用 break 来控制什么时候退出。
死循环的几种写法
// while 死循环(最常用)
while (1) {
// 循环体
// 满足某个条件时用 break 跳出
}
// for 死循环
for (;;) {
// 循环体
}
// do-while 死循环(用得少)
do {
// 循环体
} while (1);
💡 while(1) 是最常用的死循环写法。1 就是“真”,条件永远成立,所以一直循环。
故意用死循环的场景
比如做一个菜单程序,用户可以反复选择功能,直到选择退出才结束:
#include <stdio.h>
int main()
{
int choice;
while (1) { // 死循环,一直显示菜单
printf("===== 菜单 =====\n");
printf("1. 功能一\n");
printf("2. 功能二\n");
printf("3. 功能三\n");
printf("0. 退出\n");
printf("================\n");
printf("请输入选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("执行功能一...\n");
break;
case 2:
printf("执行功能二...\n");
break;
case 3:
printf("执行功能三...\n");
break;
case 0:
printf("再见!\n");
return 0; // 直接退出程序
default:
printf("输入错误,请重新选择\n");
break;
}
printf("\n"); // 空一行,好看
}
return 0;
}
💡 你看,这个程序用了 while(1) 死循环,用户可以反复操作菜单,直到选择 0 才退出。这就是故意使用死循环的典型场景。
六、业务场景适配
光说理论太干了,我给大家举几个实际工作中会用到 while 循环的场景,让大家有个概念。
场景 1:用户输入验证
要求用户输入一个 1-100 之间的数,如果输错了就让他重新输,直到输对为止。
#include <stdio.h>
int main()
{
int num;
printf("请输入一个 1-100 之间的数:");
scanf("%d", &num);
// 只要输入不对,就一直让他重新输
while (num < 1 || num > 100) {
printf("输入不对!请重新输入:");
scanf("%d", &num);
}
printf("你输入的是:%d,输入正确!\n", num);
return 0;
}
💡 这种场景用 do-while 写也可以,而且可能更合适,因为输入至少要执行一次嘛。大家可以试试改成 do-while 版本。
场景 2:猜数字游戏
系统随机生成一个 1-100 的数,让用户猜,猜大了提示“大了”,猜小了提示“小了”,猜对了就结束。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int answer, guess;
int count = 0; // 记录猜了几次
// 生成随机数(后面会讲,现在先照着写)
srand(time(0));
answer = rand() % 100 + 1; // 1-100 的随机数
printf("欢迎来到猜数字游戏!\n");
printf("我想了一个 1-100 之间的数,你来猜猜看吧~\n\n");
do {
printf("请输入你猜的数:");
scanf("%d", &guess);
count++;
if (guess > answer) {
printf("猜大了!再小一点~\n");
} else if (guess < answer) {
printf("猜小了!再大一点~\n");
} else {
printf("恭喜你猜对了!\n");
printf("你一共猜了 %d 次\n", count);
}
} while (guess != answer); // 没猜对就继续猜
return 0;
}
💡 这个游戏是不是很有意思?大家可以运行玩玩。这里用 do-while 就很合适,因为至少要猜一次嘛。
场景 3:累加求和(不知道加到多少)
求 1+2+3+…+n,直到和超过 1000 为止,求此时的 n 是多少。
#include <stdio.h>
int main()
{
int sum = 0;
int n = 0;
while (sum <= 1000) {
n++;
sum += n;
}
printf("当 n=%d 时,和=%d,超过了 1000\n", n, sum);
return 0;
}
💡 运行结果:当 n=45 时,和=1035,超过了 1000。这种“不知道要加到第几个”的场景,用 while 循环就很合适。
七、常见坑点总结
- 坑 1:忘记写更新语句 → 导致死循环(比如 while 里忘了 i++)
- 坑 2:do-while 后面忘记写分号 → 编译报错
- 坑 3:while 后面多写了分号 →
while(条件);循环体变成空语句了 - 坑 4:循环条件写反了 → 该循环的时候不循环,不该循环的时候死循环
- 坑 5:用浮点数作为循环条件 → 浮点数有精度问题,可能导致判断不准
坑点演示:浮点数做循环条件
// 不推荐的写法
double x = 0.0;
while (x != 1.0) { // 浮点数判断相等很危险!
x += 0.1;
}
// 可能因为精度问题,x 永远不等于 1.0,变成死循环
⚠️ 记住:不要用浮点数来做循环条件的相等判断!浮点数有精度误差,很容易出问题。
八、三种循环大总结
最后给大家做个总结,把三种循环放在一起对比一下:
- for 循环:知道循环次数时用,结构清晰,三要素集中
- while 循环:不知道循环次数时用,写法简洁自然
- do-while 循环:至少要执行一次时用,先执行后判断
- 三种循环可以互相改写,功能上是等价的
- 都可以用 break 跳出,用 continue 跳过本轮
- 都要注意避免死循环(除非你就是故意的)
九、课后小练习
- 用 while 循环求 1 到 100 的和(之前用 for 写过,这次用 while 试试)
- 用 do-while 写一个程序:不断输入数字,求输入的所有数的平均值,输入 0 时结束
- 写一个程序:输入一个正整数,将它反转输出(比如输入 123,输出 321)
- 写一个程序:求两个数的最大公约数(提示:用辗转相除法)
- 思考一下:什么场景下你会选择用 while 而不是 for?举 2-3 个例子
💡 恭喜你! 到这里,C 语言的三种程序结构(顺序、选择、循环)就都学完了。掌握了这些,你就可以写出很多有意思的程序了!后面我们会继续学习数组、函数等更高级的内容,加油!
1万+

被折叠的 条评论
为什么被折叠?



