while
while 是“先判断、后执行”的循环语句。每次迭代前都会先对条件表达式求值,条件为零则立即结束循环。
1. 语法与执行模型
c
while (condition) {
statement;
}1
2
3
2
3
运行结果:该代码块主要用于语法或结构说明,单独运行通常无终端输出。
condition 需要是标量表达式。只要求值结果非零,循环体就会继续执行。由于判断发生在循环体之前,while 适合“可能一次都不执行”的场景。
2. 典型示例
c
#include <stdio.h>
int main(void) {
int n = 5;
int fact = 1;
while (n > 1) {
fact *= n;
n--;
}
printf("%d\n", fact);
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
可能的输出(示例):
bash
<输出与输入或平台相关,请以实际运行为准>
这段代码每轮把当前 n 累乘到 fact,再递减 n。当 n 下降到 1 时条件不再成立,循环结束。
3. 易错点
while 的终止条件必须与循环体中的状态更新配套。若条件依赖的对象从不改变,就会形成无限循环。若确实需要无限循环,建议显式写 while (1) 并在循环体中通过 break 给出退出路径。
4. 读取驱动循环
while 还适合“每轮先尝试读取,再决定是否继续”的结构。关键是把判断条件写成“本轮读取是否成功”,而不是先假设成功再进入循环。
c
#include <stdio.h>
int main(void) {
int x;
long long sum = 0;
while (scanf("%d", &x) == 1) {
sum += x;
}
printf("%lld\n", sum);
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
可能的输出(示例):
bash
<输出与输入或平台相关,请以实际运行为准>
这种写法把输入边界直接写进循环条件,结束条件清楚,也便于处理异常输入。
5. 与 for 的改写关系
很多计数型 while 都可以改写为 for。两者在语义上可等价,但强调点不同:while 强调条件持续成立,for 强调循环控制对象。
c
/* while 版本 */
int i = 0;
while (i < 10) {
work(i);
++i;
}
/* for 版本 */
for (int j = 0; j < 10; ++j) {
work(j);
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
运行结果:该代码块主要用于语法或结构说明,单独运行通常无终端输出。
选择哪一种,关键看哪种更能直接表达你的控制意图。
6. 维护循环不变式
while 循环是否可靠,关键在于每轮都维持同一组不变条件。例如“索引始终在合法范围内”“累计值始终对应已处理输入”。把不变式写清楚后,continue、break、错误分支都更容易检查是否破坏约束,这比单纯关注循环写法本身更重要。
习题
- 输入 n,使用循环计算并输出斐波那契数列的第 n 项。