一、循环的重要性
想象一下你需要打印100次"Hello World",如果没有循环,你需要写100行printf语句!循环让计算机能够重复执行特定代码块,是编程中不可或缺的结构。本文将全面介绍C语言中的各种循环语句,帮助你掌握重复执行代码的艺术。
二、C语言中的循环类型
C语言提供了四种主要的循环结构:
goto语句与if构成的循环while循环do-while循环for循环
三、goto语句:无条件跳转
基本语法
标签名:
// 代码
goto 标签名;
示例:简单计数循环
#include <stdio.h>
int main() {
int count = 0;
loop: // 标签
printf("%d\n", count);
count++;
if (count < 5) {
goto loop; // 跳转到标签处
}
return 0;
}
使用场景与注意事项
- 适用场景:错误处理、跳出多重嵌套循环
- 注意事项:
- 过度使用会降低代码可读性
- 只能在函数内部跳转,不能跨函数
- 一般建议限制使用,优先考虑其他循环结构
四、while循环:先判断后执行
基本语法
while (条件表达式) {
// 循环体
}
示例:计算1到100的和
#include <stdio.h>
int main() {
int sum = 0;
int i = 1;
while (i <= 100) {
sum += i;
i++;
}
printf("1到100的和是: %d\n", sum);
return 0;
}
特点与注意事项
- 特点:先检查条件,条件为真才执行循环体
- 无限循环:
while(1) { }会一直执行,常用于服务器程序等 - 重要提示:即使循环体只有一行代码,也建议使用大括号
五、do-while循环:先执行后判断
基本语法
do {
// 循环体
} while (条件表达式);
示例:至少执行一次的循环
#include <stdio.h>
int main() {
int number;
do {
printf("请输入一个正数: ");
scanf("%d", &number);
} while (number <= 0);
printf("你输入的是: %d\n", number);
return 0;
}
特点与注意事项
- 特点:至少执行一次循环体,然后再检查条件
- 适用场景:需要至少执行一次的情况,如菜单选择、输入验证
- 注意:不要忘记while后面的分号
六、for循环:最常用的循环结构
基本语法
for (初始化; 条件; 更新) {
// 循环体
}
示例:打印乘法表
#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() {
// 同时控制两个变量
for (int i = 0, j = 10; i < j; i++, j--) {
printf("i = %d, j = %d\n", i, j);
}
return 0;
}
for循环的特殊形式
for (;;) { } // 无限循环
for (int i = 0; ; i++) { } // 条件永远为真
for (; i < 10;) { } // 省略初始化和更新
七、循环控制语句
1. break语句:跳出循环
#include <stdio.h>
int main() {
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 当i等于5时跳出循环
}
printf("%d ", i);
}
// 输出: 0 1 2 3 4
return 0;
}
2. continue语句:跳过本次循环
#include <stdio.h>
int main() {
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
printf("%d ", i);
}
// 输出: 1 3 5 7 9
return 0;
}
break与continue的区别
| 特性 | break | continue |
|---|---|---|
| 作用 | 完全终止循环 | 跳过当前迭代,继续下一次循环 |
| 使用场景 | 满足某个条件时提前结束循环 | 满足某个条件时跳过当前循环 |
八、循环嵌套
示例:打印图案
#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;
}
输出结果:
*
* *
* * *
* * * *
* * * * *
九、循环选择指南
| 循环类型 | 适用场景 | 特点 |
|---|---|---|
| while | 不确定循环次数的情况 | 先判断后执行 |
| do-while | 至少需要执行一次的情况 | 先执行后判断 |
| for | 已知循环次数的情况 | 结构清晰,易于控制 |
| goto | 特殊情况,如错误处理 | 灵活但降低可读性 |
十、实战练习
练习1:数字金字塔
#include <stdio.h>
int main() {
int n = 5;
for (int i = 1; i <= n; i++) {
// 打印空格
for (int j = 1; j <= n - i; j++) {
printf(" ");
}
// 打印数字
for (int k = 1; k <= i; k++) {
printf("%d ", k);
}
printf("\n");
}
return 0;
}
练习2:寻找素数
#include <stdio.h>
int main() {
int limit = 100;
printf("1到100之间的素数: ");
for (int i = 2; i <= limit; i++) {
int isPrime = 1; // 假设i是素数
// 检查i是否能被2到i-1之间的数整除
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) {
isPrime = 0; // 不是素数
break;
}
}
if (isPrime) {
printf("%d ", i);
}
}
return 0;
}
练习3:简易计算器(可重复使用)
#include <stdio.h>
int main() {
char choice;
do {
float num1, num2;
char operator;
printf("请输入表达式 (例如: 5 + 3): ");
scanf("%f %c %f", &num1, &operator, &num2);
switch (operator) {
case '+':
printf("结果: %.2f\n", num1 + num2);
break;
case '-':
printf("结果: %.2f\n", num1 - num2);
break;
case '*':
printf("结果: %.2f\n", num1 * num2);
break;
case '/':
if (num2 != 0) {
printf("结果: %.2f\n", num1 / num2);
} else {
printf("错误: 除数不能为0\n");
}
break;
default:
printf("错误: 不支持的运算符\n");
}
printf("是否继续? (y/n): ");
scanf(" %c", &choice); // 注意前面的空格,用于吸收换行符
} while (choice == 'y' || choice == 'Y');
printf("感谢使用计算器!\n");
return 0;
}
十一、常见错误与调试技巧
- 无限循环:确保循环条件最终会变为假
- 忘记更新循环变量:特别是在while和do-while循环中
- 混淆break和continue:记住break完全退出循环,continue跳过当前迭代
- 循环嵌套错误:确保内层循环的变量与外层不同
- 使用调试技巧:
- 添加打印语句跟踪变量值
- 使用调试器设置断点
- 简化问题,先测试小范围情况
十二、总结
循环是C语言编程的核心概念之一,掌握好循环语句对于编写高效、简洁的代码至关重要:
- while循环适用于不确定循环次数的情况
- do-while循环确保至少执行一次循环体
- for循环最适合已知循环次数的情况
- break和continue提供了更精细的循环控制
- 循环嵌套可以处理更复杂的问题
1408

被折叠的 条评论
为什么被折叠?



