课时9:C 语言循环结构详解:while 与 do-while 循环

摘要

本文全面介绍了 C 语言中 while 和 do-while 循环的语法、执行逻辑、适用场景及常见用法。主要内容包括:

  1. while 循环:适用于循环次数未知、仅知停止条件的场景,遵循“先判断后执行”原则,需注意避免因缺少更新语句导致的死循环。
  2. do-while 循环:while 循环的变种,特点是“先执行后判断”,循环体至少执行一次,适合菜单程序、输入验证等场景。
  3. 循环选择指南:for 循环适合已知循环次数;while 循环适合未知次数但知停止条件;do-while 循环适合至少执行一次的场景。三者功能等价,可互相改写。
  4. 死循环:介绍了 while(1)、for(;😉 等写法,并展示了故意使用死循环的典型场景(如菜单程序)。
  5. 实战场景:通过用户输入验证、猜数字游戏、累加求和三个示例,演示了 while/do-while 在实际编程中的应用。
  6. 常见坑点:总结了忘记更新语句、do-while 漏写分号、while 后误加分号、条件写反、浮点数作循环条件等五大常见错误及规避方法。
  7. 课后练习:提供了 5 道练习题,帮助巩固 while/do-while 循环的编程技能。

掌握 while 和 do-while 循环,能让你在循环次数不确定或需要至少执行一次的场景下编写更简洁、自然的代码。

一、既然有了 for,为什么还要学 while?

上节课我们学了 for 循环,它确实很好用。但有些场景下,用 while 循环会更合适、更自然。

举个例子:

  • 你知道要循环多少次 → 用 for 循环(比如打印 100 遍、循环 5 次)
  • 你不知道要循环多少次,只知道满足什么条件就停下来 → 用 while 循环更合适

比如:“一直输入数字,直到输入 0 就停止”。你不知道用户会输入几个数字,只知道遇到 0 就停。这种场景用 while 写起来就很舒服。

二、while 循环基本语法

语法格式

while (条件) {
    // 循环体:要重复执行的代码
}

while 循环的意思就是:当条件成立时,就一直执行循环体里的代码。

执行顺序

  1. 第 1 步:判断条件是否成立
  2. 第 2 步:如果成立,执行循环体;如果不成立,直接结束循环
  3. 第 3 步:执行完循环体后,回到第 1 步,继续判断条件

……就这样循环往复。

💡 口诀:先判断,后执行。条件成立才循环。

简单示例:打印 1 到 10

#include <stdio.h>
int main()
{
    int i = 1;  // 初始化
    while (i <= 10) {  // 循环条件
        printf("%d ", i);
        i++;  // 更新(一定要有!不然会死循环)
    }
    printf("\n循环结束\n");
    return 0;
}

💡 运行结果1 2 3 4 5 6 7 8 9 10 循环结束

⚠️ 重要提醒:while 循环里一定要有让条件变成假的代码!也就是要有“更新”的步骤。不然条件永远成立,就变成死循环了,程序会一直跑一直跑,停不下来。

while 和 for 的对比

其实 while 循环和 for 循环是可以互相改写的。for 循环的三要素(初始化、条件、更新),while 循环也都有,只是位置不一样:

// for 循环写法
for (i = 1; i <= 10; i++) {
    printf("%d ", i);
}

// while 循环写法
i = 1;          // 初始化放外面
while (i <= 10) {  // 条件放这里
    printf("%d ", i);
    i++;       // 更新放循环体里
}

💡 你看,是不是一一对应的?两种循环其实能干一样的事,只是写法不同。

三、do-while 循环:先斩后奏

do-while 循环是 while 循环的“变种”。它和 while 的区别是:while 是先判断再执行,do-while 是先执行再判断。

也就是说,do-while 循环的循环体至少会执行一次!

语法格式

do {
    // 循环体:要重复执行的代码
} while (条件);  // 注意:这里有个分号!

执行顺序

  1. 第 1 步:先执行一次循环体(不管条件咋样,先干了再说)
  2. 第 2 步:判断条件是否成立
  3. 第 3 步:如果成立,继续执行循环体;如果不成立,结束循环
  4. 第 4 步:执行完循环体后,回到第 2 步,继续判断

……就这样循环往复。

💡 口诀:先执行,后判断。至少执行一次。

简单示例

#include <stdio.h>
int main()
{
    int i = 1;
    do {
        printf("%d ", i);
        i++;
    } while (i <= 10);  // 这里有分号!别忘了!
    printf("\n循环结束\n");
    return 0;
}

💡 运行结果1 2 3 4 5 6 7 8 9 10 循环结束。看起来和 while 好像一样?那区别在哪呢?

区别演示:条件一开始就不成立

#include <stdio.h>
int main()
{
    int i = 100;
    printf("while 循环的情况:\n");
    while (i <= 10) {
        printf("%d ", i);
        i++;
    }
    printf("(while 循环结束,一次都没执行)\n\n");

    printf("do-while 循环的情况:\n");
    i = 100;
    do {
        printf("%d ", i);
        i++;
    } while (i <= 10);
    printf("(do-while 循环结束,执行了一次)\n");
    return 0;
}

💡 运行结果

while 循环的情况:
(while 循环结束,一次都没执行)

do-while 循环的情况:
100 (do-while 循环结束,执行了一次)

⚠️ 划重点:while 循环可能一次都不执行,do-while 循环至少执行一次!这是它们最核心的区别。

四、三种循环怎么选?

现在我们学了三种循环:for、while、do-while。很多同学会纠结:我到底该用哪个?

  1. for 循环 —— 知道循环次数时首选

    • 适合场景:明确知道要循环多少次
    • 比如:打印 100 遍、循环 5 次、遍历数组
    • 优点:三要素写在一起,结构清晰,不容易漏写更新
  2. while 循环 —— 不知道循环次数时首选

    • 适合场景:不知道要循环多少次,只知道停止条件
    • 比如:一直输入直到遇到 0、一直读文件直到读完
    • 优点:写法简洁,读起来像“当……的时候就循环”,很自然
  3. do-while 循环 —— 至少要执行一次时用

    • 适合场景:循环体至少要执行一次的情况
    • 比如:菜单程序(先显示菜单,再判断要不要继续)、输入验证
    • 优点:保证至少执行一次
    • 缺点:用得相对少一些,很多场景用 while 也能实现

💡 其实三种循环在功能上是等价的,都能互相改写。选哪个主要看哪个写起来更顺手、更易读。

五、死循环(无限循环)

什么是死循环?就是条件永远成立,循环永远停不下来。

死循环一般是 bug,是我们要避免的。但有时候,我们也会故意写死循环,然后在循环体里用 break 来控制什么时候退出。

死循环的几种写法

// while 死循环(最常用)
while (1) {
    // 循环体
    // 满足某个条件时用 break 跳出
}

// for 死循环
for (;;) {
    // 循环体
}

// do-while 死循环(用得少)
do {
    // 循环体
} while (1);

💡 while(1) 是最常用的死循环写法。1 就是“真”,条件永远成立,所以一直循环。

故意用死循环的场景

比如做一个菜单程序,用户可以反复选择功能,直到选择退出才结束:

#include <stdio.h>
int main()
{
    int choice;
    while (1) {  // 死循环,一直显示菜单
        printf("===== 菜单 =====\n");
        printf("1. 功能一\n");
        printf("2. 功能二\n");
        printf("3. 功能三\n");
        printf("0. 退出\n");
        printf("================\n");
        printf("请输入选择:");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("执行功能一...\n");
                break;
            case 2:
                printf("执行功能二...\n");
                break;
            case 3:
                printf("执行功能三...\n");
                break;
            case 0:
                printf("再见!\n");
                return 0;  // 直接退出程序
            default:
                printf("输入错误,请重新选择\n");
                break;
        }
        printf("\n");  // 空一行,好看
    }
    return 0;
}

💡 你看,这个程序用了 while(1) 死循环,用户可以反复操作菜单,直到选择 0 才退出。这就是故意使用死循环的典型场景。

六、业务场景适配

光说理论太干了,我给大家举几个实际工作中会用到 while 循环的场景,让大家有个概念。

场景 1:用户输入验证

要求用户输入一个 1-100 之间的数,如果输错了就让他重新输,直到输对为止。

#include <stdio.h>
int main()
{
    int num;
    printf("请输入一个 1-100 之间的数:");
    scanf("%d", &num);

    // 只要输入不对,就一直让他重新输
    while (num < 1 || num > 100) {
        printf("输入不对!请重新输入:");
        scanf("%d", &num);
    }

    printf("你输入的是:%d,输入正确!\n", num);
    return 0;
}

💡 这种场景用 do-while 写也可以,而且可能更合适,因为输入至少要执行一次嘛。大家可以试试改成 do-while 版本。

场景 2:猜数字游戏

系统随机生成一个 1-100 的数,让用户猜,猜大了提示“大了”,猜小了提示“小了”,猜对了就结束。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int answer, guess;
    int count = 0;  // 记录猜了几次

    // 生成随机数(后面会讲,现在先照着写)
    srand(time(0));
    answer = rand() % 100 + 1;  // 1-100 的随机数

    printf("欢迎来到猜数字游戏!\n");
    printf("我想了一个 1-100 之间的数,你来猜猜看吧~\n\n");

    do {
        printf("请输入你猜的数:");
        scanf("%d", &guess);
        count++;

        if (guess > answer) {
            printf("猜大了!再小一点~\n");
        } else if (guess < answer) {
            printf("猜小了!再大一点~\n");
        } else {
            printf("恭喜你猜对了!\n");
            printf("你一共猜了 %d 次\n", count);
        }
    } while (guess != answer);  // 没猜对就继续猜

    return 0;
}

💡 这个游戏是不是很有意思?大家可以运行玩玩。这里用 do-while 就很合适,因为至少要猜一次嘛。

场景 3:累加求和(不知道加到多少)

求 1+2+3+…+n,直到和超过 1000 为止,求此时的 n 是多少。

#include <stdio.h>
int main()
{
    int sum = 0;
    int n = 0;

    while (sum <= 1000) {
        n++;
        sum += n;
    }

    printf("当 n=%d 时,和=%d,超过了 1000\n", n, sum);
    return 0;
}

💡 运行结果:当 n=45 时,和=1035,超过了 1000。这种“不知道要加到第几个”的场景,用 while 循环就很合适。

七、常见坑点总结

  1. 坑 1:忘记写更新语句 → 导致死循环(比如 while 里忘了 i++)
  2. 坑 2:do-while 后面忘记写分号 → 编译报错
  3. 坑 3:while 后面多写了分号 → while(条件); 循环体变成空语句了
  4. 坑 4:循环条件写反了 → 该循环的时候不循环,不该循环的时候死循环
  5. 坑 5:用浮点数作为循环条件 → 浮点数有精度问题,可能导致判断不准

坑点演示:浮点数做循环条件

// 不推荐的写法
double x = 0.0;
while (x != 1.0) {  // 浮点数判断相等很危险!
    x += 0.1;
}
// 可能因为精度问题,x 永远不等于 1.0,变成死循环

⚠️ 记住:不要用浮点数来做循环条件的相等判断!浮点数有精度误差,很容易出问题。

八、三种循环大总结

最后给大家做个总结,把三种循环放在一起对比一下:

  • for 循环:知道循环次数时用,结构清晰,三要素集中
  • while 循环:不知道循环次数时用,写法简洁自然
  • do-while 循环:至少要执行一次时用,先执行后判断
  • 三种循环可以互相改写,功能上是等价的
  • 都可以用 break 跳出,用 continue 跳过本轮
  • 都要注意避免死循环(除非你就是故意的)

九、课后小练习

  1. 用 while 循环求 1 到 100 的和(之前用 for 写过,这次用 while 试试)
  2. 用 do-while 写一个程序:不断输入数字,求输入的所有数的平均值,输入 0 时结束
  3. 写一个程序:输入一个正整数,将它反转输出(比如输入 123,输出 321)
  4. 写一个程序:求两个数的最大公约数(提示:用辗转相除法)
  5. 思考一下:什么场景下你会选择用 while 而不是 for?举 2-3 个例子

💡 恭喜你! 到这里,C 语言的三种程序结构(顺序、选择、循环)就都学完了。掌握了这些,你就可以写出很多有意思的程序了!后面我们会继续学习数组、函数等更高级的内容,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flowHEHE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值