在C语言里,循环用来让一段代码根据条件反复执行。语言本身提供了三种标准循环语句,分别是for、while和do-while。它们底层都依赖条件跳转指令,只是语法形态和适用场合不同。理解它们的差异,是写出正确且易读程序的基础。

for循环:已知次数的首选
for循环的语法把循环变量初始化、继续条件和步进操作集中在括号中,结构清晰,特别适合遍历固定长度的集合。例如要打印0到9的数字,可以这么写:
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 10; i++) {
printf("当前i的值为:%dn", i);
}
return 0;
}
上面代码中,i = 0只执行一次;每次循环前判断i < 10;循环体结束后执行i++。如果一开始条件就不满足,循环体一次都不运行。这种写法把控制逻辑收拢在一处,降低了遗漏自增导致死循环的风险。
当处理数组时,for的优势更明显。假设有一个长度为5的整型数组,用for遍历既直观又不容易越界:
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
int i;
for (i = 0; i < 5; i++) {
printf("arr[%d] = %dn", i, arr[i]);
}
return 0;
}
需要注意的是,for括号里的两个分号不能省略,但表达式可以为空。比如写成for (;;) 就是无限循环,常在嵌入式主函数里见到,靠内部break退出。
while循环:条件先行的重复
while循环在每次执行循环体之前判断条件,如果条件为假就直接跳过。它适合那些循环次数不能提前确定的情况,比如从键盘持续读取数据直到用户输入特定值。
#include <stdio.h>
int main() {
int num;
printf("输入0结束:n");
scanf("%d", &num);
while (num != 0) {
printf("你输入了:%dn", num);
scanf("%d", &num);
}
return 0;
}
这段代码先读一次数字,只要不是0就进入循环打印,并在体内再次读取。若第一次就输入0,循环体完全不执行。这种先判断后执行的特性,使while很适合做资源轮询或事件等待。
使用while时要保证循环体内有改变条件的语句,否则会变成死循环。例如忘记写scanf那一行,num永远不为0,程序就会卡住。相较for,while把条件更新分散在别处,可读性稍弱,但灵活度更高。
do-while循环:至少执行一次
do-while把条件判断放在循环体后面,因此无论条件如何,主体至少跑一遍。这在需要先展示菜单再按用户选择决定是否继续的场景中非常实用。
#include <stdio.h>
int main() {
int choice;
do {
printf("1.开始 2.退出n");
printf("请选择:");
scanf("%d", &choice);
} while (choice != 2);
return 0;
}
即使用户直接输入2,菜单也会先打印一次,然后才退出。注意do-while结尾的分号不能丢,这是初学者常犯的语法错误。它和while的唯一区别就是判断时机,选哪个取决于业务是否要求首轮必跑。
在真实项目中,do-while也常用于读取缓冲区或重试机制,比如先尝试连接一次,失败再根据次数决定是否重连。这种结构能让正常路径代码更自然。
break与continue的控制
循环体内可用break立刻终止整个循环,用continue跳过本次剩余代码直接进入下一轮判断。两者都能改变默认的顺序执行流。
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 10; i++) {
if (i == 3) continue;
if (i == 8) break;
printf("%d ", i);
}
return 0;
}
上例会输出0 1 2 4 5 6 7,其中3被continue跳过,8被break截断后续。合理运用这两个关键字能简化多层条件嵌套,但滥用会让循环出口变多,增加维护难度。建议只在确能提升清晰度时使用。
嵌套循环里break只跳出最内层,若想退出外层,通常要借助标志变量或把逻辑抽成函数。书写时保持循环职责单一,有助于减少此类复杂控制。
常见写法误区
新手常把赋值号=写成判断号==,例如在while里写while (x = 0),这会把x赋成0且条件恒假,循环根本不进。还有人在for里修改循环变量后又用其做数组下标,造成越界。这些细节都需要在编译时开启警告来捕捉。
另一个问题是浮点数做条件,由于精度误差,for (double d = 0.0; d != 1.0; d += 0.1)可能永远停不下来。应改为小于某个阈值并允许误差,或改用整数计数再换算。掌握这些边界情况,才能写出稳妥的C语言循环。