循环
引言
本章逻辑结构如下:
- 先介绍循环的基本概念。
- 然后详细讲解三种主要循环:while、do-while 和 for。
- 最后讨论嵌套循环、循环控制语句(如break和continue)以及常见错误。
第一节:循环基础
循环是一种控制结构,用于重复执行代码块。C语言提供三种循环语句:while、do-while 和 for。每种循环都有入口条件(决定是否进入循环)和退出条件(决定何时停止)。
关键术语:
- 迭代:循环的一次执行。
- 无限循环:如果条件永不满足,循环会无限运行(通常是错误)。
- 循环体:{} 内要重复的代码。
循环通常与计数器变量结合使用,比如 int i = 0;
第二节:while 循环
while 循环在条件为真时重复执行代码。先检查条件,再执行循环体(可能一次都不执行)。
语法:
while (条件) {
// 循环体
}
示例:打印1到5。
#include <stdio.h>
int main() {
int i = 1;
while (i <= 5) {
printf("%d\n", i);
i++; // 别忘更新条件,否则无限循环!
}
return 0;
}
输出: 1 2 3 4 5
注意事项:
- 条件是表达式,返回真(非0)或假(0)。
- 必须在循环体内更新条件变量。
- 适用于不确定迭代次数的情况,如读取输入直到EOF。
第三节:do-while 循环
do-while 循环先执行循环体,再检查条件(至少执行一次)。
语法:
do {
// 循环体
} while (条件);
注意:while后有;。
示例:至少打印一次菜单。
#include <stdio.h>
int main() {
int choice;
do {
printf("输入1继续,0退出:");
scanf("%d", &choice);
} while (choice != 0);
return 0;
}
注意事项:
- 适合需要至少执行一次的场景,如菜单系统。
- 条件在循环后检查。
第四节:for 循环
for 循环是最结构化的,常用于已知迭代次数的情况。集初始化、条件、更新于一身。
语法:
for (初始化; 条件; 更新) {
// 循环体
}
示例:打印1到5。
#include <stdio.h>
int main() {
for (int i = 1; i <= 5; i++) {
printf("%d\n", i);
}
return 0;
}
注意事项:
- 初始化只执行一次(如int i=0)。
- 条件为真时执行循环体,然后更新(如i++)。
- 部分可省略,但;必须保留(如for(;;) 是无限循环)。
- 适用于计数循环,如遍历数组。
第五节:嵌套循环和控制语句
5.1 嵌套循环
循环内可嵌套另一个循环,常用于二维结构如矩阵。
示例:打印3x3矩阵。
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("(%d,%d) ", i, j);
}
printf("\n");
}
输出: (0,0) (0,1) (0,2) (1,0) (1,1) (1,2) (2,0) (2,1) (2,2)
5.2 循环控制语句
- break:立即退出当前循环。
- continue:跳过本次迭代剩余代码,继续下一次。
- goto:跳转到标签(不推荐,易导致 spaghetti code)。
示例:用break提前退出。
for (int i = 1; i <= 10; i++) {
if (i == 5) break;
printf("%d ", i);
}
// 输出: 1 2 3 4
continue 示例:
for (int i = 1; i <= 5; i++) {
if (i % 2 == 0) continue;
printf("%d ", i); // 只打印奇数: 1 3 5
}
注意事项:
- 在嵌套循环中,break/continue 只影响最近的循环。
- 避免过度使用,以保持代码可读性。
第六节:常见错误和最佳实践
- 无限循环:忘记更新计数器。调试时用Ctrl+C中断。
- 越界:for循环中i从0到n-1遍历数组。
- 浮点条件:避免用==比较浮点数(精度问题),用epsilon。
- 最佳实践:用for已知次数,while/do-while未知次数。保持循环体简短。
总结与进阶
这一章我们掌握了C语言的循环结构,能处理重复任务。结合上章的条件语句,你现在能写出基本的控制流程序。