Appearance
循环
在C语言中,循环语句用于重复执行一段代码,直到满足特定条件为止。循环是程序设计中非常重要的概念,它可以帮助我们处理重复性的任务,减少代码冗余。在本章节中,我们将学习C语言中的各种循环语句及其使用方法。
1. 为什么需要循环?
循环语句在以下场景中特别有用:
- 重复执行相同的操作:如计算1到100的和
- 处理批量数据:如遍历数组中的所有元素
- 等待特定条件:如等待用户输入正确的值
- 实现菜单系统:如重复显示菜单直到用户选择退出
2. while循环
while循环是C语言中最基本的循环语句,用于当条件为真时重复执行代码块。
2.1 语法
c
while (条件) {
// 循环体:条件为真时执行的代码
}2.2 执行流程
- 检查条件是否为真(非0)
- 如果条件为真,执行循环体
- 执行完循环体后,回到步骤1,再次检查条件
- 如果条件为假,退出循环
2.3 示例
c
#include <stdio.h>
int main() {
int i = 1;
while (i <= 5) {
printf("i = %d\n", i);
i++;
}
printf("循环结束\n");
return 0;
}输出结果:
i = 1
i = 2
i = 3
i = 4
i = 5
循环结束2.4 注意事项
- 无限循环:如果条件永远为真,会导致无限循环,应确保循环体内有使条件变为假的语句
- 空循环体:如果循环体为空,可以使用分号
;作为循环体
3. do-while循环
do-while循环是一种先执行循环体,后检查条件的循环语句,确保循环体至少执行一次。
3.1 语法
c
do {
// 循环体:至少执行一次的代码
} while (条件);3.2 执行流程
- 执行循环体
- 检查条件是否为真
- 如果条件为真,回到步骤1,再次执行循环体
- 如果条件为假,退出循环
3.3 示例
c
#include <stdio.h>
int main() {
int i = 1;
do {
printf("i = %d\n", i);
i++;
} while (i <= 5);
printf("循环结束\n");
return 0;
}输出结果:
i = 1
i = 2
i = 3
i = 4
i = 5
循环结束3.4 while vs do-while
- while循环:先检查条件,再执行循环体,可能一次也不执行
- do-while循环:先执行循环体,再检查条件,至少执行一次
3.5 示例:do-while的应用场景
c
#include <stdio.h>
int main() {
int choice;
do {
printf("\n菜单:\n");
printf("1. 选项1\n");
printf("2. 选项2\n");
printf("3. 退出\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("你选择了选项1\n");
break;
case 2:
printf("你选择了选项2\n");
break;
case 3:
printf("退出程序\n");
break;
default:
printf("无效的选择\n");
break;
}
} while (choice != 3);
return 0;
}在这个例子中,我们使用do-while循环实现了一个菜单系统,确保菜单至少显示一次。
4. for循环
for循环是C语言中最常用的循环语句,它将初始化、条件检查和迭代语句组合在一起,使循环结构更加清晰。
4.1 语法
c
for (初始化; 条件; 迭代) {
// 循环体:条件为真时执行的代码
}4.2 说明
- 初始化:在循环开始前执行一次,通常用于初始化循环变量
- 条件:每次循环开始前检查,为真时执行循环体
- 迭代:每次循环结束后执行,通常用于更新循环变量
4.3 执行流程
- 执行初始化语句
- 检查条件是否为真
- 如果条件为真,执行循环体
- 执行迭代语句
- 回到步骤2,再次检查条件
- 如果条件为假,退出循环
4.4 示例
c
#include <stdio.h>
int main() {
int i;
for (i = 1; i <= 5; i++) {
printf("i = %d\n", i);
}
printf("循环结束\n");
return 0;
}输出结果:
i = 1
i = 2
i = 3
i = 4
i = 5
循环结束4.5 灵活的for循环
for循环的三个部分都可以省略,但分号必须保留:
4.5.1 省略初始化
c
#include <stdio.h>
int main() {
int i = 1;
for (; i <= 5; i++) {
printf("i = %d\n", i);
}
return 0;
}4.5.2 省略条件
c
#include <stdio.h>
int main() {
int i;
for (i = 1; ; i++) {
if (i > 5) break;
printf("i = %d\n", i);
}
return 0;
}4.5.3 省略迭代
c
#include <stdio.h>
int main() {
int i;
for (i = 1; i <= 5;) {
printf("i = %d\n", i);
i++;
}
return 0;
}4.5.4 省略所有部分(无限循环)
c
#include <stdio.h>
int main() {
int i = 1;
for (;;) {
if (i > 5) break;
printf("i = %d\n", i);
i++;
}
return 0;
}5. 循环控制语句
C语言提供了三种循环控制语句,用于改变循环的执行流程:
- break:跳出当前循环
- continue:跳过本次循环,进入下一次循环
- goto:跳转到指定的标签位置
5.1 break语句
break语句用于立即跳出当前循环,执行循环后面的代码。
5.1.1 示例
c
#include <stdio.h>
int main() {
int i;
for (i = 1; i <= 10; i++) {
if (i == 6) {
break; // 当i等于6时跳出循环
}
printf("i = %d\n", i);
}
printf("循环结束\n");
return 0;
}输出结果:
i = 1
i = 2
i = 3
i = 4
i = 5
循环结束5.2 continue语句
continue语句用于跳过本次循环的剩余部分,直接进入下一次循环的条件检查。
5.2.1 示例
c
#include <stdio.h>
int main() {
int i;
for (i = 1; i <= 5; i++) {
if (i == 3) {
continue; // 当i等于3时跳过本次循环
}
printf("i = %d\n", i);
}
printf("循环结束\n");
return 0;
}输出结果:
i = 1
i = 2
i = 4
i = 5
循环结束5.3 goto语句
goto语句用于无条件跳转到指定的标签位置,可以用于跳出多层循环。
5.3.1 语法
c
goto 标签;
...
标签:
// 跳转到这里5.3.2 示例
c
#include <stdio.h>
int main() {
int i, j;
for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3; j++) {
printf("i = %d, j = %d\n", i, j);
if (i == 2 && j == 2) {
goto end_loop; // 跳转到标签end_loop
}
}
}
end_loop:
printf("循环结束\n");
return 0;
}输出结果:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
循环结束5.3.3 注意事项
goto语句可能会使代码结构混乱,应尽量避免使用,特别是在大型程序中。
6. 嵌套循环
嵌套循环是指在一个循环的循环体中包含另一个循环,用于处理更复杂的问题。
6.1 示例:打印乘法表
c
#include <stdio.h>
int main() {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= i; j++) {
printf("%d × %d = %d\t", j, i, i * j);
}
printf("\n");
}
return 0;
}输出结果:
1 × 1 = 1
1 × 2 = 2 2 × 2 = 4
1 × 3 = 3 2 × 3 = 6 3 × 3 = 9
1 × 4 = 4 2 × 4 = 8 3 × 4 = 12 4 × 4 = 16
1 × 5 = 5 2 × 5 = 10 3 × 5 = 15 4 × 5 = 20 5 × 5 = 25
1 × 6 = 6 2 × 6 = 12 3 × 6 = 18 4 × 6 = 24 5 × 6 = 30 6 × 6 = 36
1 × 7 = 7 2 × 7 = 14 3 × 7 = 21 4 × 7 = 28 5 × 7 = 35 6 × 7 = 42 7 × 7 = 49
1 × 8 = 8 2 × 8 = 16 3 × 8 = 24 4 × 8 = 32 5 × 8 = 40 6 × 8 = 48 7 × 8 = 56 8 × 8 = 64
1 × 9 = 9 2 × 9 = 18 3 × 9 = 27 4 × 9 = 36 5 × 9 = 45 6 × 9 = 54 7 × 9 = 63 8 × 9 = 72 9 × 9 = 817. 循环的选择
在不同的场景中,应选择合适的循环语句:
7.1 while循环
- 适用场景:当循环次数不确定,只知道循环条件时
- 优点:结构简单,易于理解
- 示例:等待用户输入正确的值
7.2 do-while循环
- 适用场景:当循环体至少需要执行一次时
- 优点:确保循环体至少执行一次
- 示例:实现菜单系统
7.3 for循环
- 适用场景:当循环次数确定时
- 优点:结构清晰,将初始化、条件和迭代放在一起
- 示例:遍历数组,计算1到n的和
8. 示例:综合运用
让我们看一个综合运用各种循环语句的例子:
c
#include <stdio.h>
int main() {
int choice, num, i, sum;
do {
printf("\n菜单:\n");
printf("1. 计算1到n的和\n");
printf("2. 打印n个星号\n");
printf("3. 打印倒三角\n");
printf("4. 退出\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入n的值:");
scanf("%d", &num);
sum = 0;
for (i = 1; i <= num; i++) {
sum += i;
}
printf("1到%d的和是:%d\n", num, sum);
break;
case 2:
printf("请输入星号的个数:");
scanf("%d", &num);
i = 0;
while (i < num) {
printf("*");
i++;
}
printf("\n");
break;
case 3:
printf("请输入行数:");
scanf("%d", &num);
for (i = num; i >= 1; i--) {
int j = 0;
while (j < i) {
printf("*");
j++;
}
printf("\n");
}
break;
case 4:
printf("退出程序\n");
break;
default:
printf("无效的选择\n");
break;
}
} while (choice != 4);
return 0;
}9. 注意事项
- 无限循环:确保循环有终止条件,避免无限循环
- 循环变量的更新:确保循环体内有更新循环变量的语句
- 循环的效率:对于大型循环,应注意优化循环体,减少不必要的计算
- 嵌套层级:避免过多的循环嵌套,以免代码难以理解
- 边界条件:注意循环的边界条件,避免越界访问
10. 示例:计算斐波那契数列
让我们看一个使用循环计算斐波那契数列的例子:
c
#include <stdio.h>
int main() {
int n, i, a = 0, b = 1, next;
printf("请输入斐波那契数列的项数:");
scanf("%d", &n);
printf("斐波那契数列的前%d项:\n", n);
for (i = 1; i <= n; i++) {
if (i == 1) {
printf("%d ", a);
continue;
}
if (i == 2) {
printf("%d ", b);
continue;
}
next = a + b;
a = b;
b = next;
printf("%d ", next);
}
printf("\n");
return 0;
}小结
C语言提供了三种主要的循环语句:
- while循环:先检查条件,再执行循环体
- do-while循环:先执行循环体,再检查条件,确保至少执行一次
- for循环:将初始化、条件检查和迭代语句组合在一起,结构清晰
此外,C语言还提供了循环控制语句:
- break:跳出当前循环
- continue:跳过本次循环的剩余部分
- goto:无条件跳转到指定标签(应尽量避免使用)
选择合适的循环语句可以使代码更加简洁、高效。在实际编程中,应根据具体场景选择合适的循环语句,并注意避免无限循环和其他常见错误。