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 1
3. 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次猜测机会 // 每次提示"太大"、"太小"或"正确"