do while循环与while循环的核心区别是什么?

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 C语言 正文

什么是 do-while 循环?

do-while 循环是 C 语言中三种基本的循环结构之一(另外两种是 for 循环和 while 循环),它的特点是:先执行一次循环体中的代码,然后再判断循环条件。

c语言do while循环
(图片来源网络,侵删)

这意味着,无论循环条件最初是否为真,do-while 循环体内的代码至少会执行一次,这在某些需要先执行操作再进行判断的场景下非常有用。


语法结构

do-while 循环的语法格式如下:

do {
    // 循环体
    // 这里是需要重复执行的代码块
} while (条件表达式);

语法要点:

  1. do: 关键字,标志着循环的开始。
  2. 花括号,包含了需要重复执行的代码,即循环体,如果循环体只有一条语句,花括号可以省略,但为了代码清晰和避免错误,强烈建议始终使用花括号。
  3. while: 关键字,标志着循环的判断部分。
  4. (条件表达式): 这是一个必须的括号,里面是一个表达式(通常是关系表达式或逻辑表达式),这个表达式会被求值。
    • 如果表达式的结果为非零(真),则程序会跳回 do 关键字,重新执行循环体。
    • 如果表达式的结果为零(假),则循环结束,程序继续执行 while 语句之后的代码。
  5. 分号 : while 语句的末尾必须有一个分号,这是 do-while 循环区别于 while 循环的一个显著特征。

执行流程

我们可以用流程图来理解 do-while 的执行过程:

c语言do while循环
(图片来源网络,侵删)
graph TD
    A[开始] --> B[执行 do 后的循环体];
    B --> C{判断 while 条件};
    C -- 条件为真 --> B;
    C -- 条件为假 --> D[循环结束, 执行后续代码];
    D --> E[结束];

流程说明:

  1. 执行循环体:程序首先无条件地进入 do 块,执行其中的所有语句。
  2. 判断条件:执行完循环体后,程序计算 while 后面的条件表达式的值。
  3. 决定下一步
    • 如果条件为,程序流程返回到步骤 1,再次执行循环体。
    • 如果条件为do-while 循环终止,程序跳转到循环结构之后的下一条语句继续执行。

一个简单的例子

让我们通过一个经典的例子来感受 do-while 循环:让用户输入一个 1 到 10 之间的数字,如果输入无效,则提示用户重新输入。

#include <stdio.h>
int main() {
    int number;
    // 使用 do-while 确保至少提示用户一次输入
    do {
        printf("请输入一个 1 到 10 之间的数字: ");
        scanf("%d", &number);
        // 检查输入是否有效
        if (number < 1 || number > 10) {
            printf("输入无效,请重新输入!\n");
        }
    } while (number < 1 || number > 10); // 如果输入无效,循环继续
    printf("恭喜!你输入了一个有效的数字: %d\n", number);
    return 0;
}

代码解析:

  1. int number;: 定义一个整型变量 number 用于存储用户输入。
  2. do { ... }: 循环开始。
    • printf(...): 提示用户输入。
    • scanf(...): 读取用户输入并存入 number
    • if (...): 检查输入的数字是否不在 1 到 10 的范围内,如果不在,打印错误信息。
  3. while (number < 1 || number > 10);: 这是循环的判断条件。
    • 只要用户输入的数字 number 小于 1 或者大于 10,这个条件就为真,循环就会继续。
    • 只有当用户输入的数字在 1 到 10 之间时,条件才为假,循环才会结束。
  4. printf("恭喜...");: 当循环结束后,说明用户已经输入了有效的数字,打印成功信息。

do-while vs. while vs. for

理解这三种循环的区别至关重要。

c语言do while循环
(图片来源网络,侵删)
特性 do-while 循环 while 循环 for 循环
执行顺序 先执行,后判断 先判断,后执行 先判断,后执行
循环体执行次数 至少执行一次 可能一次都不执行 可能一次都不执行
语法结构 do { ... } while (条件); while (条件) { ... } for (初始化; 条件; 更新) { ... }
适用场景 当循环体必须至少执行一次时,菜单选择、密码输入、需要先读取数据再判断的场景。 当循环次数不确定,且循环体可能不需要执行时,等待某个事件发生。 当循环次数确定或已知时,或者需要一个明确的计数器时。

对比 whiledo-while

假设我们想把上面的例子改成 while 循环:

#include <stdio.h>
int main() {
    int number;
    // 使用 while 循环
    while (number < 1 || number > 10) { // 先判断!number 是一个未初始化的垃圾值
        printf("请输入一个 1 到 10 之间的数字: ");
        scanf("%d", &number);
        if (number < 1 || number > 10) {
            printf("输入无效,请重新输入!\n");
        }
    }
    printf("恭喜!你输入了一个有效的数字: %d\n", number);
    return 0;
}

问题所在:

while 循环中,number 在第一次被使用(判断条件)时,它没有被初始化,其值是内存中的随机垃圾值,这个垃圾值可能恰好就在 1 到 10 之间,导致 while 条件为假,循环直接跳过,用户根本没有机会输入,这就是 while 循环可能一次都不执行的原因。

do-while 循环完美地解决了这个问题,因为它保证用户至少会被提示一次并输入。


注意事项和最佳实践

  1. 不要忘记分号 while 后面的分号是 do-while 循环语法的一部分,极易被遗忘,忘记它会导致编译错误或逻辑错误。

    // 错误示例
    do {
        printf("Hello\n");
    } while (i < 10) // 缺少分号!编译器会报错
  2. 避免无限循环:确保循环条件最终会变为假,否则程序将陷入无限循环。

    // 危险!无限循环
    int i = 1;
    do {
        printf("This will run forever!\n");
        // i 没有被更新,i < 10 永远为真
    } while (i < 10);
  3. 使用花括号 :即使循环体只有一条语句,也强烈建议使用花括号,这能提高代码可读性,并且在后续需要添加更多语句时,可以避免因忘记加花括号而导致的逻辑错误。

    // 不推荐(虽然语法正确)
    do
        printf("Hello\n");
    while (i < 10);
    // 推荐
    do {
        printf("Hello\n");
    } while (i < 10);

do-while 循环是 C 语言中一个强大且特定用途的工具,记住它的核心特征:

“先执行,后判断,至少执行一次。”

当你需要编写一段代码,确保它至少运行一次,然后再根据某个条件决定是否继续重复时,do-while 循环就是你的最佳选择,最常见的应用场景包括用户交互(如菜单、输入验证)和需要初始化后才能判断的循环过程。

-- 展开阅读全文 --
头像
dede首页图片尺寸如何调整?
« 上一篇 03-17
C语言int转float会丢失精度吗?
下一篇 » 03-17
取消
微信二维码
支付宝二维码

目录[+]