C语言循环语句详解:for循环、while循环、do-while循环的使用与区别
C语言循环语句(for/while)终极指南:打破重复代码的魔咒
C语言for循环、while循环、do-while循环的使用与区别你知道吗?本文将详细讲解for循环、while循环和do-while循环的语法和使用场景,包含break、continue关键字和嵌套循环的实战应用。
在编程中,我们经常需要重复执行某些操作。比如:计算1到100的和、处理数组中的每个元素、等待用户输入直到有效等。如果每次都写重复的代码,不仅效率低下,而且难以维护。C语言提供了强大的循环语句来解决这个问题。
本篇教程将深入讲解“for循环、while循环、do-while循环”三种循环结构,让你彻底掌握循环编程技巧。
1. 什么是循环?
循环是重复执行一段代码直到满足特定条件的控制结构。C语言提供了三种主要的循环语句:
- for循环:适合已知循环次数的场景
- while循环:适合未知循环次数,但需要先检查条件的场景
- do-while循环:适合至少执行一次,再检查条件的场景
2. for循环:最常用的循环结构
语法:
for (初始化; 循环条件; 更新表达式) {
    // 循环体
}执行流程:
- 执行初始化语句(只执行一次)
- 检查循环条件,如果为假则退出循环
- 执行循环体内的代码
- 执行更新表达式
- 回到第2步继续检查条件
#include <stdio.h>
int main() {
    // 示例1:打印1到10的数字
    printf("1到10的数字:");
    for (int i = 1; i <= 10; i++) {
        printf("%d ", i);
    }
    printf("\n");
    
    // 示例2:计算1到100的和
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
        sum += i;
    }
    printf("1到100的和:%d\n", sum);
    
    // 示例3:递减循环
    printf("10到1的倒数:");
    for (int i = 10; i >= 1; i--) {
        printf("%d ", i);
    }
    printf("\n");
    
    return 0;
}运行结果:
1到10的数字:1 2 3 4 5 6 7 8 9 10 
1到100的和:5050
10到1的倒数:10 9 8 7 6 5 4 3 2 13. while循环:条件驱动循环
语法:
while (循环条件) {
    // 循环体
}执行流程:
- 检查循环条件,如果为假则退出循环
- 执行循环体内的代码
- 回到第1步继续检查条件
#include <stdio.h>
int main() {
    // 示例1:模拟用户登录验证
    int password = 123456;
    int input;
    int attempts = 0;
    
    printf("请输入密码:");
    scanf("%d", &input);
    
    while (input != password && attempts < 2) {
        attempts++;
        printf("密码错误,还剩%d次机会:", 3 - attempts);
        scanf("%d", &input);
    }
    
    if (input == password) {
        printf("登录成功!\n");
    } else {
        printf("登录失败,账户已锁定!\n");
    }
    
    // 示例2:计算数字的位数
    int number, count = 0;
    printf("请输入一个正整数:");
    scanf("%d", &number);
    
    int temp = number;
    while (temp != 0) {
        temp /= 10;  // 去掉最后一位
        count++;
    }
    
    printf("%d 是 %d 位数\n", number, count);
    
    return 0;
}4. do-while循环:至少执行一次
语法:
do {
    // 循环体
} while (循环条件);执行流程:
- 执行循环体内的代码
- 检查循环条件,如果为真则继续执行
- 回到第1步
#include <stdio.h>
int main() {
    int choice;
    
    do {
        printf("\n=== 菜单 ===\n");
        printf("1. 查询余额\n");
        printf("2. 存款\n");
        printf("3. 取款\n");
        printf("0. 退出\n");
        printf("请选择操作:");
        scanf("%d", &choice);
        
        switch (choice) {
            case 1:
                printf("当前余额:1000元\n");
                break;
            case 2:
                printf("存款功能暂未开放\n");
                break;
            case 3:
                printf("取款功能暂未开放\n");
                break;
            case 0:
                printf("感谢使用,再见!\n");
                break;
            default:
                printf("无效选择,请重新输入!\n");
        }
    } while (choice != 0);  // 直到用户选择0才退出
    
    return 0;
}5. 循环控制语句:break和continue
break语句:立即退出当前循环
continue语句:跳过本次循环剩余代码,直接开始下一次循环
#include <stdio.h>
int main() {
    // break示例:查找第一个能被7整除的数
    printf("break示例:");
    for (int i = 1; i <= 20; i++) {
        if (i % 7 == 0) {
            printf("找到第一个能被7整除的数:%d\n", i);
            break;  // 找到后立即退出循环
        }
        printf("%d ", i);
    }
    
    // continue示例:打印1-20中的奇数
    printf("continue示例:");
    for (int i = 1; i <= 20; i++) {
        if (i % 2 == 0) {
            continue;  // 如果是偶数,跳过本次循环
        }
        printf("%d ", i);
    }
    printf("\n");
    
    return 0;
}6. 嵌套循环:循环中的循环
#include <stdio.h>
int main() {
    // 打印乘法口诀表
    printf("乘法口诀表:\n");
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            printf("%d×%d=%-2d  ", j, i, i * j);
        }
        printf("\n");
    }
    
    // 打印金字塔图案
    printf("\n金字塔图案:\n");
    int rows = 5;
    for (int i = 1; i <= rows; i++) {
        // 打印空格
        for (int j = 1; j <= rows - i; j++) {
            printf(" ");
        }
        // 打印星号
        for (int k = 1; k <= 2 * i - 1; k++) {
            printf("*");
        }
        printf("\n");
    }
    
    return 0;
}7. 三种循环的比较与选择
| 循环类型 | 特点 | 适用场景 | 
|---|---|---|
| for循环 | 循环次数明确,结构紧凑 | 遍历数组、固定次数的计算 | 
| while循环 | 先判断后执行,可能一次都不执行 | 用户输入验证、文件读取 | 
| do-while循环 | 先执行后判断,至少执行一次 | 菜单系统、游戏主循环 | 
8. 常见错误与最佳实践
常见错误1:无限循环
// 错误:缺少更新表达式,导致无限循环
int i = 1;
while (i <= 10) {
    printf("%d ", i);
    // 忘记写 i++,导致无限循环
}
// 正确写法
int i = 1;
while (i <= 10) {
    printf("%d ", i);
    i++;  // 重要:更新循环变量
}常见错误2:分号位置错误
// 错误:for循环后面误加分号
for (int i = 0; i < 10; i++); {  // 这个分号导致循环体为空
    printf("这行代码只执行一次!\n");
}
// 正确写法
for (int i = 0; i < 10; i++) {
    printf("这行代码执行10次!\n");
}最佳实践:
- 使用有意义的循环变量名(如i、j、k用于计数)
- 避免在循环体内修改循环变量(除非必要)
- 复杂的循环逻辑要添加注释说明
- 确保循环最终能够结束(避免无限循环)
9. 实战案例:素数判断器
#include <stdio.h>
#include <stdbool.h>  // 使用bool类型
int main() {
    int number;
    bool is_prime = true;
    
    printf("请输入一个正整数:");
    scanf("%d", &number);
    
    if (number <= 1) {
        is_prime = false;
    } else {
        // 检查从2到number-1是否有能整除的数
        for (int i = 2; i * i <= number; i++) {
            if (number % i == 0) {
                is_prime = false;
                break;
            }
        }
    }
    
    if (is_prime) {
        printf("%d 是素数\n", number);
    } else {
        printf("%d 不是素数\n", number);
    }
    
    // 扩展:打印100以内的所有素数
    printf("\n100以内的素数:");
    for (int i = 2; i <= 100; i++) {
        bool prime = true;
        for (int j = 2; j * j <= i; j++) {
            if (i % j == 0) {
                prime = false;
                break;
            }
        }
        if (prime) {
            printf("%d ", i);
        }
    }
    printf("\n");
    
    return 0;
}10. 总结
在本篇教程中,你学到了:
- for循环的完整语法和执行流程
- while循环的条件驱动特性
- do-while循环的至少执行一次特性
- break和continue对循环流程的控制
- 嵌套循环处理二维结构问题
- 三种循环的适用场景和选择原则
- 循环编程的常见错误和最佳实践
11. 动手练习
- 基础练习:编写程序计算n的阶乘(n!)。
// 提示:n! = 1 × 2 × 3 × ... × n
- 进阶练习:编写程序打印斐波那契数列的前n项。
// 斐波那契数列:1, 1, 2, 3, 5, 8, 13, ... // 每个数是前两个数之和
- 挑战练习:编写猜数字游戏。
// 程序随机生成1-100的数字 // 用户有7次猜测机会 // 每次提示"太大"、"太小"或"正确"