在C语言里,循环结构用来重复执行某段代码,while和do while都属于条件控制循环。二者最容易被忽略的不是写法,而是“什么时候做判断”。这个细节会决定某些逻辑是否被执行,以及程序在边界输入下的表现。

一、语法形式与基本结构
while循环的语法非常直观:关键字while后面跟一对圆括号包裹的判断表达式,再接循环体。如果表达式为真,就进入循环体;执行完后再回来判断,直到表达式为假才退出。
do while循环的写法略有不同,它用do开头,循环体放在do和while之间,判断表达式写在while后面的圆括号里,并且末尾必须带分号。这种结构从视觉上就提示了我们:循环体在前面,判断在后面。
#include <stdio.h>
int main() {
int i = 0;
// while写法
while (i < 3) {
printf("while: %dn", i);
i++;
}
int j = 0;
// do while写法
do {
printf("do while: %dn", j);
j++;
} while (j < 3);
return 0;
}
二、执行流程的本质差异
while是“先判断后执行”。程序运行到while语句时,首先计算条件表达式。若结果为0(假),循环体直接被跳过,控制权交给后续代码。这意味着当初始条件就不满足时,循环体可能完全不运行。
do while是“先执行后判断”。程序进入do块后,无条件执行一次循环体,然后再计算while里的条件。只有当这次判断为假时,才结束循环。因此无论条件如何,循环体至少执行一次。下面用初始条件为假的情况来对比:
#include <stdio.h>
int main() {
int x = 10;
// 条件一开始就是假,循环体不会执行
while (x < 5) {
printf("while runn");
}
int y = 10;
// 条件一开始也是假,但循环体先跑一次
do {
printf("do while runn");
} while (y < 5);
return 0;
}
运行上面这段代码,while部分没有任何输出,而do while部分会打印一次“do while run”。这个实验清楚地说明了二者在控制流上的分叉点。
三、典型使用场景对比
当你希望“满足条件才做事”,比如遍历数组、读取文件直到末尾,while更自然。因为若一开始就没有数据,没必要进入处理逻辑。
当你希望“先做再决定要不要继续”,比如命令行菜单、用户输入校验,do while更合适。例如让用户输入数字,至少要让用户输一次,再根据合法性决定是否重新输入:
#include <stdio.h>
int main() {
int num;
do {
printf("请输入1到10之间的数:");
scanf("%d", &num);
} while (num < 1 || num > 10);
printf("你输入了合法值:%dn", num);
return 0;
}
如果换成while,变量num未初始化就判断,行为是未定义的;即便先赋初值,也可能因初值合法而跳过输入提示,体验不对。do while在这里把“至少交互一次”变成了语言层面的保证。
四、常见误区与注意事项
一个常见错误是忘记do while末尾的分号,导致编译报错。另一个误区是认为二者可以随意互换。实际上在边界条件下,互换会改变程序语义,比如上面的输入校验例子。
还要注意循环体内对条件变量的修改。如果while循环体里忘了更新判断变量,会造成死循环;do while同样如此,而且因为它至少执行一次,死循环前还会多做一次无用操作。写循环时建议先想清楚“谁在改变条件”。
| 对比维度 | while | do while |
|---|---|---|
| 判断时机 | 进入前判断 | 执行后判断 |
| 最少执行次数 | 0次 | 1次 |
| 末尾分号 | 不需要 | 需要 |
| 适合场景 | 先验条件成立才处理 | 先处理再视情况继续 |
五、小结
while与do while的核心区别只有一句话:判断在前还是在后。这个区别决定了循环体是否至少运行一次,也划定了各自适用的代码场景。写C语言时,先问自己“能不能一次都不做”,答案决定你该用哪一个。
掌握它们不需要死记,写两段小程序跑一下边界条件,体会就扎实了。后续遇到菜单、重试、轮询等逻辑,自然会知道该选哪种循环。
c语言while循环do_while循环修改时间:2026-08-03 01:27:24