第五章——循环结构 第一节——while语句和do...while结构
这篇文章最后更新于 some 天前,内容可能已经过时。
一、while语句:谨慎派的「先问路再出发」
1.1 基本语法与执行逻辑
执行流程图:

1.2 案例解析:1到100的累加和
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h> int main() { int i = 1, sum = 0; while(i <= 100) { printf("第%d次循环:sum=%d + %d\n", i, sum, i); sum += i; i++; } printf("最终结果:sum=%d\n", sum); return 0; }
|
调试输出示例:
1 2 3 4 5
| 第1次循环:sum=0 + 1 第2次循环:sum=1 + 2 ... 第100次循环:sum=4950 + 100 最终结果:sum=5050
|
关键点:
- 初始化:
i=1 和 sum=0 必须在循环前完成。
- 条件判断:
i <= 100 决定循环是否继续。
- 更新变量:
i++ 是循环终止的关键,否则会陷入死循环。
1.3 常见错误与避坑指南
| 错误类型 |
错误代码 |
修复方法 |
| 死循环 |
while(1) { ... } |
添加 break 或更新条件变量 |
| 循环体不执行 |
int i=2; while(i<=1) {...} |
检查初始条件是否合理 |
| 循环变量未更新 |
while(i<=100) { sum+=i; } |
在循环体内添加 i++ |
1.4 真题实战:理解前置/后置自增
题目:以下代码输出什么?
1 2 3
| int k = 5; while(--k) printf("%d", k -= 3);
|
解析步骤:
--k 先减1 → k=4,非0进入循环。
k -= 3 → k=1,输出 1。
- 再次
--k → k=0,循环终止。
答案:输出 1。
几个关键点
- while后的表达式,可以是C语言中任意合法的表达式,通常为关系表达式或逻辑表达式,但也可以是其它运算表达式。
- 当表达式值的值为零时,表示条件为假;
- 表达式值为非零时,表示条件为真。
- 循环体可以是一条简单可执行语句,也可以是复合语句
- 如果第一次计算时表达式的值就为0,则循环语句一次也不被执行,流程直接跳过while语句,执行下一条语句。
二、do-while结构:实践派的「先出发再看路」
2.1 基本语法与执行逻辑
1 2 3 4 5
| do { } while(条件表达式);
|
执行流程图:

2.2 案例解析:ATM取款验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <stdio.h> int main() { int pin = 1234, input; do { printf("请输入4位数密码:"); scanf("%d", &input); if (input != pin) { printf("密码错误,请重试!\n"); } } while(input != pin);
printf("验证成功!欢迎使用ATM。\n"); return 0; }
|
运行示例:
1 2 3 4
| 请输入4位数密码:1111 密码错误,请重试! 请输入4位数密码:1234 验证成功!欢迎使用ATM。
|
2.3 常见错误与避坑指南
| 错误类型 |
错误代码 |
修复方法 |
| 忘记分号 |
} while(condition) |
补全分号 } while(condition); |
| 条件逻辑错误 |
} while(1 == 2) |
修正条件表达式 |
| 循环体未初始化 |
int n; do { ... } while(...); |
给 n 赋初始值 |
2.4 真题实战:后置自增陷阱
题目:以下代码输出什么?
1 2 3 4
| int a = 7; while(a--) printf("Loop "); printf("a=%d", a);
|
解析步骤:
a=7 进入循环,先执行 printf,后 a-- → a=6。
- 循环直到
a=0 时,a-- 变为 -1,条件为假终止。
- 最终
a=-1。
答案:输出8次 Loop ,最后输出 a=-1。
三、对比分析:while vs do-while
| 特性 |
while |
do-while |
| 执行次数 |
可能0次 |
至少1次 |
| 适用场景 |
已知边界条件(如读文件EOF) |
需强制初始化(如游戏菜单) |
| 代码安全性 |
需先验证条件 |
易因条件错误执行无效操作 |
| 典型比喻 |
先查天气再出门 |
先出门再看天气 |
四、高级技巧与调试方法
4.1 使用调试器观察变量变化
- GDB调试命令:
1 2 3 4 5 6
| gcc -g code.c -o code gdb ./code break main.c:5 run step print i
|
4.2 用打印法追踪循环流程
1 2 3 4 5 6 7 8
| int i = 1; while(i <= 3) { printf("[循环开始] i=%d\n", i); printf(" 执行操作...\n"); i++; printf("[循环结束] i=%d\n\n", i); }
|
输出:
1 2 3 4 5 6 7 8 9 10 11
| [循环开始] i=1 执行操作... [循环结束] i=2
[循环开始] i=2 执行操作... [循环结束] i=3
[循环开始] i=3 执行操作... [循环结束] i=4
|
4.3 避免无限循环的终极技巧
- 添加超限保护:
1 2 3 4 5 6 7 8
| int count = 0; while(条件) { if (count++ > 1000) { printf("循环超限,强制退出!"); break; } }
|
五、总结:选择的艺术
- 选while:当需要严格控制循环开始条件时(如读取文件直到EOF)。
- 选do-while:当必须执行一次初始化操作时(如游戏菜单系统、输入验证)。
🎯 记忆口诀:
「先判断用while,保底执行用do-while」
就像人生选择——审慎决策用 while,破釜沉舟用 do-while!