流程控制循环语句

在编程中,循环语句用于重复执行一段代码,直到满足特定条件为止。循环是解决重复性任务的核心工具,例如计算1到100的和、遍历数组、处理用户输入等。 C语言提供了三种循环结构:while循环、do-while循环和for循环。此外,breakcontinue语句可以更灵活地控制循环流程。 掌握循环语句,可以让你的程序更高效、简洁。

🔹 while 循环

while循环是最基本的循环结构,当条件为真时重复执行循环体,直到条件变为假。

语法:

while (条件表达式) {
    // 循环体语句
}

执行流程: 先判断条件,如果为真,执行循环体;执行完毕后再次判断条件,直到条件为假时退出循环。如果初始条件为假,循环体一次也不执行。

📝 示例:打印1到10

#include <stdio.h>

int main() {
    int i = 1;
    while (i <= 10) {
        printf("%d ", i);
        i++;   // 更新循环变量,防止无限循环
    }
    printf("\n");
    return 0;
}

📝 示例:计算1到100的和

#include <stdio.h>

int main() {
    int sum = 0, i = 1;
    while (i <= 100) {
        sum += i;
        i++;
    }
    printf("1+2+...+100 = %d\n", sum);
    return 0;
}
注意: while循环中必须有改变循环条件的语句,否则会形成无限循环

🔹 do-while 循环

do-while循环与while类似,区别在于它先执行一次循环体,再判断条件,因此循环体至少执行一次。

语法:

do {
    // 循环体语句
} while (条件表达式);   // 注意分号

📝 示例:至少输出一次信息

#include <stdio.h>

int main() {
    int i = 11;
    do {
        printf("i = %d\n", i);
        i++;
    } while (i <= 10);   // 条件为假,但仍执行了一次循环体
    return 0;
}

📝 示例:猜数字游戏(用户至少猜一次)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    int secret, guess;
    srand(time(0));
    secret = rand() % 100 + 1;  // 1-100随机数

    do {
        printf("猜一个数字(1-100): ");
        scanf("%d", &guess);
        if (guess > secret)
            printf("太大了!\n");
        else if (guess < secret)
            printf("太小了!\n");
    } while (guess != secret);

    printf("恭喜,猜对了!\n");
    return 0;
}
应用场景: 当循环体至少需要执行一次时,使用do-while循环非常合适,例如菜单选择、输入验证等。

🔹 for 循环

for循环将初始化、条件判断和循环变量更新集中在一行,结构清晰,是使用最频繁的循环结构。

语法:

for (初始化表达式; 条件表达式; 更新表达式) {
    // 循环体语句
}

执行流程: 先执行初始化(仅一次),然后判断条件,若为真则执行循环体,然后执行更新表达式,再判断条件,如此反复,直到条件为假退出。

📝 示例:打印1到10(for循环)

#include <stdio.h>

int main() {
    for (int i = 1; i <= 10; i++) {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}

📝 示例:计算阶乘

#include <stdio.h>

int main() {
    int n;
    long long factorial = 1;
    printf("请输入一个非负整数: ");
    scanf("%d", &n);

    if (n < 0) {
        printf("负数没有阶乘\n");
    } else {
        for (int i = 1; i <= n; i++) {
            factorial *= i;
        }
        printf("%d! = %lld\n", n, factorial);
    }
    return 0;
}
注意: for循环的三个表达式都可以省略,但分号必须保留。省略条件表达式表示条件永远为真,形成无限循环。

🔹 循环控制语句:break 和 continue

  • break:立即退出当前循环(最内层循环),程序继续执行循环后面的代码。
  • continue:跳过本次循环剩余的代码,直接进入下一次循环判断。

📝 示例:break 的使用

#include <stdio.h>

int main() {
    // 寻找第一个能被7整除的数
    for (int i = 1; i <= 100; i++) {
        if (i % 7 == 0) {
            printf("第一个能被7整除的数是: %d\n", i);
            break;   // 找到后立即退出循环
        }
    }
    return 0;
}

📝 示例:continue 的使用

#include <stdio.h>

int main() {
    // 打印1到10之间的奇数
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            continue;   // 偶数跳过
        }
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}
注意: 在嵌套循环中,break和continue只作用于最内层循环。要跳出外层循环,可以使用标志变量或goto语句(但goto不推荐滥用)。

🔹 嵌套循环

循环内部可以包含其他循环,称为嵌套循环。常用于处理多维数组、打印图形等场景。

📝 示例:打印乘法口诀表

#include <stdio.h>

int main() {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            printf("%d*%d=%2d ", j, i, i * j);
        }
        printf("\n");
    }
    return 0;
}

📝 示例:打印星形三角形

#include <stdio.h>

int main() {
    int rows = 5;
    for (int i = 1; i <= rows; i++) {
        for (int j = 1; j <= i; j++) {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

🔹 无限循环

无限循环是指条件永远为真,通常用于需要持续运行直到特定事件发生的场景(如服务器监听、菜单程序)。可以通过break或条件标志退出。

#include <stdio.h>

int main() {
    int choice;
    while (1) {   // 无限循环
        printf("1. 选项1\n2. 选项2\n3. 退出\n请选择: ");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                printf("执行选项1\n");
                break;
            case 2:
                printf("执行选项2\n");
                break;
            case 3:
                printf("退出程序\n");
                return 0;  // 或 break; 但需要跳出while
            default:
                printf("无效输入\n");
        }
    }
    return 0;
}
常见无限循环写法: for(;;)while(1)while(true)(C99引入stdbool.h后可使用bool类型)。

📋 综合示例:求质数

#include <stdio.h>

int main() {
    int n, i, isPrime;
    printf("请输入一个正整数: ");
    scanf("%d", &n);

    if (n <= 1) {
        printf("%d 不是质数\n", n);
        return 0;
    }

    isPrime = 1;  // 假设是质数
    for (i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            isPrime = 0;
            break;
        }
    }

    if (isPrime)
        printf("%d 是质数\n", n);
    else
        printf("%d 不是质数\n", n);

    return 0;
}

⚠️ 常见错误与注意事项

  • 无限循环: 忘记更新循环变量或条件永远为真,导致程序无法终止。
  • 分号位置错误: 例如在while后误加分号:while(i<10); { ... },导致循环体为空,陷入死循环。
  • do-while后忘记分号: do {...} while(cond) 必须加分号。
  • 循环变量作用域: C99/C11支持在for循环内定义变量,如 for(int i=0; ...),变量i仅在循环内有效。使用传统编译器时注意。
  • 嵌套循环中break/continue: 只能控制所在的最内层循环,不能直接跳出外层循环。
  • 比较运算符与赋值混淆: while(i = 10) 会将10赋给i,条件永远为真,导致死循环。

循环语句让程序具备了重复执行的能力,是处理批量数据、实现复杂逻辑的基础。熟练运用whiledo-whilefor循环,并结合breakcontinue,可以编写出高效、优雅的代码。 下一章我们将学习数组,它是存储多个同类型数据的结构,常与循环结合使用。