C 语言书
模块二 · 流程与数据 / 第 08 课

08 · 循环:for / while

核心 40 分钟 跳到过关题
学习目标
  • 会写 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 的经典坑
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++) 循环体会执行几次?

必做作业
  1. 用 for 打印 1 到 10。
  2. 用 while 计算 1+2+...+100 的和。
  3. 找出死循环: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++;。