while和for循环,选哪个更合适?

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

核心思想:循环的本质

无论是 while 还是 for,它们的根本目的都是重复执行一段代码,直到某个特定的条件不再满足为止,你可以把它们想象成一个“程序的旋钮”,你设定好规则,它就会一直转动,直到规则被打破。


while 循环

while 循环被称为“当型循环”,它的逻辑非常直观:当某个条件为真时,就一直执行循环体。

语法结构

while (条件表达式) {
    // 循环体
    // 当条件表达式为真时,这里面的代码会被反复执行
}

工作流程

  1. 判断条件:程序会计算 中的 条件表达式
  2. 条件为真:如果表达式的结果为真(非零),程序就执行 中的 循环体
  3. 返回判断:执行完循环体后,程序会再次回到第1步,重新判断条件。
  4. 条件为假:如果表达式的结果为假(零),程序就跳过 中的代码,直接执行 while 循环后面的语句。

重要特性:while 是“前测试”循环

这意味着循环体是否被执行,完全取决于进入循环时条件的真假,如果一开始条件就是假的,那么循环体一次都不会被执行。

示例代码:从1数到5

#include <stdio.h>
int main() {
    int i = 1; // 1. 初始化循环变量
    // 2. 判断条件
    while (i <= 5) {
        // 3. 执行循环体
        printf("%d ", i);
        // 4. 更新循环变量 (非常重要!)
        i++;
    }
    printf("\n循环结束,\n");
    return 0;
}

代码解析:

  1. int i = 1;:我们定义并初始化一个计数器 i
  2. while (i <= 5):进入循环,检查 i 是否小于或等于 5。
    • 第一次:i 是 1,条件 1 <= 5 为真,进入循环。
    • 打印 1
    • i++i 变成 2。
    • 第二次:i 是 2,条件 2 <= 5 为真,再次进入循环。
    • 第五次:i 是 5,条件 5 <= 5 为真,进入循环,打印 5
    • i++i 变成 6。
    • 第六次:i 是 6,条件 6 <= 5 为假,循环结束。
  3. 程序跳转到 printf("\n循环结束,\n");

while 循环的典型使用场景

当你不确定循环需要执行多少次,但循环的结束条件很明确时,while 循环是最佳选择。

  • 用户输入验证:让用户输入一个1到100之间的数字,如果输入无效,就让他一直重试。
    int number;
    while (number < 1 || number > 100) {
        printf("请输入一个1到100之间的数字: ");
        scanf("%d", &number);
    }
  • 读取文件直到末尾:持续从文件中读取数据,直到遇到文件结束符。
    char ch;
    while ((ch = fgetc(file)) != EOF) {
        // 处理字符 ch
    }
  • 游戏主循环:游戏会一直运行,直到玩家选择退出。
    int isPlaying = 1;
    while (isPlaying) {
        // 更新游戏状态
        // 渲染画面
        // 检测玩家是否按下了退出键
        // if (player_pressed_quit) isPlaying = 0;
    }

for 循环

for 循环被称为“计数循环”“步进循环”,它将初始化、条件和更新这三个循环的核心要素都放在了一行,使得代码更加紧凑和清晰。

语法结构

for (表达式1; 表达式2; 表达式3) {
    // 循环体
}

这三个表达式各有其固定的含义:

  1. 表达式1:初始化

    • 只在循环开始前执行一次。
    • 通常用于初始化循环变量(如 int i = 0;)。
    • 可以有多个初始化语句,用逗号隔开(如 int i = 0, sum = 0;)。
  2. 表达式2:条件

    • 这是一个条件表达式
    • 每次执行循环体之前,都会判断这个条件。
    • 如果为真,则执行循环体;如果为假,则循环结束。
    • 如果省略此表达式,则默认条件永远为真,会形成无限循环
  3. 表达式3:更新

    • 每次执行完循环体之后,都会执行这个表达式。
    • 通常用于更新循环变量(如 i++)。
    • 也可以有多个更新语句,用逗号隔开(如 i++, sum += i;)。

工作流程

for 循环可以看作是 while 循环的精简版:

// 等价的 while 循环写法
表达式1;  // 只执行一次
while (表达式2) {
    // 循环体
    表达式3;
}

示例代码:从1数到5

#include <stdio.h>
int main() {
    // 初始化; 条件; 更新
    for (int i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    printf("\n循环结束,\n");
    return 0;
}

代码解析:

  1. int i = 1:循环开始前,i 被初始化为 1。
  2. i <= 5:判断条件,1 <= 5 为真,进入循环,打印 1
  3. i++:循环体执行完后,i 自增为 2。
  4. i <= 5:再次判断条件,2 <= 5 为真,进入循环,打印 2
  5. 打印 5 后,i++ 使 i 变为 6。
  6. i <= 5:再次判断条件,6 <= 5 为假,循环结束。

for 循环的典型使用场景

当你确切地知道循环需要执行的次数时,for 循环是首选,它将所有与循环控制相关的代码集中在一行,结构非常清晰。

  • 遍历数组:这是 for 循环最经典的用法。
    int scores[5] = {95, 88, 76, 100, 65};
    for (int i = 0; i < 5; i++) {
        printf("第%d个学生的分数是: %d\n", i + 1, scores[i]);
    }
  • 执行固定次数:让某段代码精确执行10次。
    for (int count = 0; count < 10; count++) {
        printf("执行第%d次\n", count + 1);
    }
  • 嵌套循环:打印一个由星号组成的三角形,for 循环的嵌套结构非常直观。
    for (int i = 1; i <= 5; i++) {
        for (int j = 0; j < i; j++) {
            printf("* ");
        }
        printf("\n");
    }

while vs for:核心区别与选择

特性 while 循环 for 循环
核心思想 当...时,就做... (When... do...) 为了...,从...到...,每次... (For... from... to... by...)
语法结构 while (条件) { ... } for (初始化; 条件; 更新) { ... }
变量作用域 循环变量在循环外定义,作用域更大。 循环变量通常在 for 语句内定义,作用域仅限于循环内部,更安全。
适用场景 不确定循环次数,但知道结束条件 确定循环次数,或需要遍历序列(如数组)。
代码风格 更灵活,逻辑更侧重于“条件判断”。 更紧凑、结构化,所有循环控制元素一目了然。
无限循环 while(1) { ... }while(true) { ... } (需要 stdbool.h) for( ; ; ) { ... }

如何选择?

  1. 首选 for 循环:当你需要遍历一个数组、列表,或者你知道循环需要跑多少次(100次、1000次)时,毫不犹豫地选择 for,它的结构清晰,能将循环的控制逻辑封装在一行,是更“现代”、更推荐的写法。

  2. 使用 while 循环

    • 当循环的结束条件不是简单的计数,而是基于一个复杂的、可能来自外部(如用户输入、文件读取)的条件时。
    • 当循环的初始化或更新逻辑比较复杂,或者需要多个地方更新循环变量时,将这些逻辑放在循环体内部会更自然。
    • 当你需要一个无限循环时,while(1) 是最常见和易读的写法。

一个特殊的变体:do-while 循环

虽然你只问了 whilefor,但为了完整性,提一下 do-while 会很有帮助,它与 while 的唯一区别是:它是“后测试”循环,即至少会执行一次循环体

#include <stdio.h>
int main() {
    int number;
    do {
        printf("请输入一个正数: ");
        scanf("%d", &number);
    } while (number <= 0); // 注意这里的分号不能少!
    printf("你输入的合法数字是: %d\n", number);
    return 0;
}

在这个例子中,无论用户第一次输入什么,程序都会先提示输入并尝试读取,然后才去判断数字是否为正,这保证了用户至少有一次输入的机会。

循环类型 执行时机 至少执行一次? 最佳实践
while 先判断,后执行 用于不确定次数,但条件明确的场景。
for 先判断,后执行 用于确定次数,或遍历序列(如数组)。
do-while 先执行,后判断 用于需要至少执行一次的场景(如菜单)。

理解 whilefor 的区别,并根据具体情况选择合适的循环,是写出高质量、可读性强的 C 代码的重要一步,记住这个简单的法则:计数用 for,条件用 while

-- 展开阅读全文 --
头像
织梦手机客服怎么添加?
« 上一篇 03-21
织梦模板是html吗
下一篇 » 03-21

相关文章

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

目录[+]