do while循环与while循环有何本质区别?

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

什么是 do-while 循环?

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

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

这意味着,无论循环条件最初是否成立,do-while 循环体内的代码至少会执行一次,这是它与 while 循环最关键的区别。


语法结构

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

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

语法要点:

  1. do:是循环的起始关键字。
  2. 花括号内是循环体,包含需要重复执行的语句,如果循环体只有一条语句,可以省略花括号,但为了代码清晰和避免错误,强烈建议始终使用花括号
  3. while:是循环的结束关键字,用于判断是否继续循环。
  4. (表达式):这是一个条件表达式,它会进行求值。
    • 如果表达式的值为非零(真,true),则循环继续,程序会跳回 do 关键字,再次执行循环体。
    • 如果表达式的值为零(假,false),则循环结束,程序继续执行 while 循环之后的下一条语句。
  5. 分号 while (表达式) 的末尾必须有一个分号,这是初学者最容易忘记的地方,会导致编译错误。

执行流程

do-while 循环的执行流程可以用以下步骤来描述:

c语言 do while 循环
(图片来源网络,侵删)
  1. 执行:执行 dowhile 之间的循环体代码。
  2. 判断:执行完循环体后,计算 while 后面括号内的表达式的值。
  3. 分支
    • 如果表达式为真(非零),则跳回第 1 步,继续执行循环体。
    • 如果表达式为假(零),则 do-while 循环结束,程序继续执行循环结构后面的代码。

我们可以用一个流程图来表示:


示例代码

示例 1:基本的数字打印

这个例子会打印数字 1 到 5。

#include <stdio.h>
int main() {
    int i = 1;
    printf("do-while 循环开始:\n");
    do {
        printf("%d ", i); // 打印当前数字
        i++;              // i 自增
    } while (i <= 5);     // 判断 i 是否小于等于 5
    printf("\n循环结束,\n");
    return 0;
}

输出:

do-while 循环开始:
1 2 3 4 5 
循环结束。

代码解析:

  1. i 初始化为 1。
  2. 第一次循环
    • 执行 printf("%d ", i);,打印 1
    • 执行 i++;i 变为 2。
    • 判断 while (i <= 5),即 2 <= 5,为真,继续循环。
  3. 第二次到第五次循环:类似地,打印 2, 3, 4, 5,i 依次变为 3, 4, 5, 6。
  4. 第六次判断
    • 循环体执行完毕,i 的值是 6。
    • 判断 while (i <= 5),即 6 <= 5,为假。
    • 循环结束,程序打印 "循环结束。"。

示例 2:至少执行一次的典型场景

假设你需要让用户输入一个密码,如果密码错误,就提示用户重新输入,无论用户第一次输入什么,程序都必须先“尝试”一次。

#include <stdio.h>
#include <string.h> // 用于 strcmp 函数
#define CORRECT_PASSWORD "123456"
int main() {
    char password[20];
    // 无论密码对不对,至少会执行一次这个循环体
    do {
        printf("请输入密码: ");
        scanf("%s", password); // 获取用户输入
        if (strcmp(password, CORRECT_PASSWORD) == 0) {
            printf("密码正确,欢迎进入!\n");
        } else {
            printf("密码错误,请重试!\n");
        }
    } while (strcmp(password, CORRECT_PASSWORD) != 0); // 只要密码不正确,就继续循环
    return 0;
}

解析:

  • do 块内的代码一定会先执行一次,让用户有机会输入密码。
  • while 条件 strcmp(password, CORRECT_PASSWORD) != 0 表示“只要密码不等于正确密码”。
  • 如果用户第一次就输对了,do 块执行后,while 条件为假(因为 != 0 不成立),循环结束。
  • 如果用户第一次输错了,do 块执行后,while 条件为真,循环继续,再次提示输入。

do-while vs. while vs. for

特性 do-while 循环 while 循环 for 循环
执行顺序 先执行,后判断 先判断,后执行 先判断,后执行
最少执行次数 至少一次 可能一次都不执行 可能一次都不执行
适用场景 循环体必须至少执行一次的情况,如菜单选择、密码输入。 循环次数不确定,且可能一次都不执行的情况,如读取文件直到末尾。 循环次数确定有明确初始化、条件、迭代步骤的情况。
语法 do { ... } while (expr); while (expr) { ... } for (init; expr; step) { ... }

while 循环示例对比: 如果把上面的密码输入例子改成 while 循环:

// 错误的用法示例
while (strcmp(password, CORRECT_PASSWORD) != 0) { // 先判断!
    printf("请输入密码: ");
    scanf("%s", password);
    // ...
}

如果用户第一次运行程序,password 变量里是未初始化的“垃圾值”,while 条件可能直接为假,导致循环体根本不执行,程序就直接结束了,用户根本没有机会输入密码,这就是 do-while 在此场景下的优势。


注意事项和常见错误

  1. 忘记末尾的分号 这是最常见的语法错误。

    // 错误示范
    do {
        printf("Hello\n");
    } while (i < 10) // 这里缺少分号!

    编译器会报错,提示在 while 附近有语法错误。

  2. 循环条件永远为真(无限循环) 如果循环条件是一个永远为真的表达式,循环将永远不会结束,导致程序“卡死”。

    int i = 1;
    do {
        printf("This will run forever!\n");
        // 忘记了 i++,导致 i 的值永远是 1
        // while (i <= 5) 永远为真
    } while (i <= 5);
  3. 变量初始化 确保在循环开始前,循环条件中使用的变量已经被正确初始化。

    int count; // 未初始化
    do {
        printf("Count: %d\n", count);
        count++;
    } while (count < 5); // count 的初始值是未知的,可能导致意外行为

do-while 循环是 C 语言中一个非常有用的工具,当你需要一段代码无论如何都必须至少执行一次时,它就是最佳选择。

核心要点回顾:

  • 语法do { ... } while (expr);
  • 特点先执行,后判断,保证循环体至少执行一次。
  • 应用场景:菜单系统、密码验证、游戏中的“至少玩一关”等。
  • 关键:不要忘记 while 后面的分号。

熟练掌握 do-while 循环,能让你的代码逻辑更加清晰和健壮。

-- 展开阅读全文 --
头像
织梦手机适配为何打开速度慢?
« 上一篇 01-12
Linux C Socket编程如何实现网络通信?
下一篇 » 01-12

相关文章

取消
微信二维码
支付宝二维码

目录[+]