08 · 循环:for / while
- 会写 for 和 while
- 会用 break / continue
- 能写「重复 N 次」和「直到条件」
for 循环
格式:for (初始化; 条件; 更新)。最常用来「重复固定次数」。
#include <stdio.h>
int main(void)
{
int i;
for (i = 0; i < 5; i++)
{
printf("第 %d 次\n", i);
}
return 0;
}
while 循环
条件为真就一直做。适合「次数不确定」的场景。
#include <stdio.h>
int main(void)
{
int n = 3;
while (n > 0)
{
printf("还剩 %d\n", n);
n--;
}
printf("结束\n");
return 0;
}
break 和 continue
break:立刻跳出当前这层循环continue:跳过本次剩下的,进入下一次
for (i = 0; i < 10; i++)
{
if (i == 3) continue; // 跳过 3
if (i == 7) break; // 到 7 就停
printf("%d ", i);
}
// 输出: 0 1 2 4 5 6
死循环
while (1) 会永远执行。有的程序就是故意这样(比如一直等用户输入)。注意别写成意外的死循环:条件永远为真、忘了更新变量。
#include <stdio.h>
int main(void)
{
int n = 0;
while (n < 3)
{
printf("%d\n", n);
n++; /* 忘了这行就会死循环 */
}
return 0;
}
do-while:至少做一次
先执行,再判断条件。适合「先问一次用户,不行再问」。
#include <stdio.h>
int main(void)
{
int n = 0;
do
{
printf("至少打印一次 n=%d\n", n);
n++;
} while (n < 0); /* 条件假,但已经跑过一次 */
return 0;
}
循环套循环
外层每走一步,内层完整跑一遍。常用来打印表格、处理二维数据。
#include <stdio.h>
int main(void)
{
int i, j;
for (i = 1; i <= 3; i++)
{
for (j = 1; j <= 3; j++)
{
printf("%d*%d=%d\t", i, j, i * j);
}
printf("\n");
}
return 0;
}
三种循环怎么选
| 场景 | 推荐 |
|---|---|
| 重复固定次数 | for |
| 次数看条件 | while |
| 至少做一次 | do-while |
for (i = 0; i <= n; i++) 会执行 n+1 次。
遍历数组时几乎总是 i < n,不是 <=。单片机场景 · for:清空显示缓冲区
已知次数的重复操作用 for,把下标限制在数组范围内。
边界与验证:执行 10 次,最后访问下标 9。变量声明放在循环前,也便于阅读传统 C 编译环境的代码。
unsigned char display_buffer[10];
unsigned char i;
for (i = 0; i < 10; i++) {
display_buffer[i] = 0;
}
单片机场景 · while:等待需要退出条件
while 适合次数不确定的重复,do-while 至少执行一次。无期限等待会阻塞后续任务。
边界与验证:flag、wait_ms 和 report_timeout 由具体工程提供,片段不能单独编译。100 次仅为重试上限,不保证精确 100 ms;中断共享变量还需考虑 volatile 和原子性。
unsigned int tries = 0;
while (flag == 0 && tries < 100) {
wait_ms(1);
tries++;
}
if (flag == 0) {
report_timeout();
}
单片机场景 · break / continue:筛选任务
break 结束当前循环;continue 跳过当前一轮剩余代码,只影响所在那一层循环。
边界与验证:work 是工程提供的函数。传入的是 1、3、5……49,遇到 50 循环结束。
unsigned char i;
for (i = 0; i < 100; i++) {
if (i == 50) break;
if (i % 2 == 0) continue;
work(i);
}
本课过关
必做for(i=0;i<4;i++) 循环体会执行几次?
for (初始化; 条件; 更新) 的执行顺序是:①执行初始化一次 → ②判断条件,假则退出 → ③执行循环体 → ④执行更新 → 回到②。本题:i=0 进入,体执行后 i=1;…;i=3 体执行后 i=4;再判断 4<4 为假,退出。所以 i 取过 0,1,2,3,体共 4 次。若条件写成 i<=4,会多跑一次变成 5 次——差一个等号,次数就多 1,这是最常见 off-by-one 错误。
- 用 for 打印 1 到 10。
- 用 while 计算 1+2+...+100 的和。
- 找出死循环:int i=0; while(i<10) { printf("%d", i); }
先自己写完,再点开看解答
1:for 打印 1~10
int i;
for (i = 1; i <= 10; i++)
printf("%d\n", i);2:1+2+…+100(高斯公式 5050 可用来对拍)
int sum = 0, i = 1;
while (i <= 100)
{
sum += i;
i++;
}
printf("%d\n", sum); /* 5050 */3:死循环原因:条件 i<10 一直成立,但循环体里没有让 i 变化的语句,i 永远是 0。修复:在 printf 后加 i++;。
下一课:一次存很多数——数组。