循环控制与实战 ——让代码拥有重复执行的力量
一、循环三剑客:场景决定选择
1. for循环:精确控制次数
适用场景:已知循环次数或需要精确控制迭代变量
// 打印1-100的偶数
for (int i = 2; i <= 100; i += 2) {
printf("%d ", i);
if (i % 20 == 0) putchar('\n'); // 每行输出10个数
}
优势:
-
循环变量自动管理
-
支持多变量控制(C99标准)
for (int i=0, j=10; i<j; i++, j--) { /*...*/ }
2. while循环:条件驱动
适用场景:不确定循环次数,需持续检测条件
// 读取用户输入直到输入q
char input = '\0';
while (input != 'q') {
printf("输入指令(q退出): ");
scanf(" %c", &input); // 注意空格跳过空白符
process_input(input);
}
典型应用:
- 文件读取直到
EOF - 游戏主循环
3. do-while循环:至少执行一次
适用场景:需要先执行操作再检查条件
// 菜单系统(至少显示一次)
int choice;
do {
print_menu();
scanf("%d", &choice);
handle_choice(choice);
} while (choice != 0); // 输入0退出
二、循环控制双雄:break与continue
1. break:紧急逃生口
作用:立即终止当前循环
// 查找数组第一个负数
int nums[] = {3, 5, -2, 7, -4};
int found = -1;
for (int i = 0; i < 5; i++) {
if (nums[i] < 0) {
found = i;
break; // 找到后立即退出循环
}
}
2. continue:跳过本轮循环
作用:提前结束当前迭代,进入下一轮
// 打印1-100非3倍数的数
for (int i = 1; i <= 100; i++) {
if (i % 3 == 0) {
continue; // 跳过3的倍数
}
printf("%d ", i);
}
对比总结:
| 关键字 | 作用范围 | 典型场景 |
|---|---|---|
break | 终止整个循环 | 提前找到目标/错误处理 |
continue | 跳过当前迭代 | 过滤特定条件数据 |
三、实战演练:算法与经典案例
1. 质数判断(时间复杂度优化版)
#include <math.h>
int is_prime(int n) {
if (n <= 1) return 0;
if (n == 2) return 1;
if (n % 2 == 0) return 0;
int max = (int)sqrt(n) + 1; // 优化关键点
for (int i = 3; i <= max; i += 2) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
优化原理:
- 只需检查到√n(数学定理)
- 跳过偶数(除2外偶数不可能是质数)
2. 九九乘法表(嵌套循环经典)
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%d×%d=%-2d ", j, i, i*j); // -2d左对齐
}
putchar('\n');
}
输出效果:
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
...(略)
四、避坑指南:5个致命错误
-
死循环陷阱
while (1) { // 正确退出方式需内部break if (condition) break; // 忘记更新循环条件变量 } -
浮点循环计数器
for (float f = 0.1; f != 1.0; f += 0.1) {} // 可能无限循环! -
continue跳过变量更新int i = 0; while (i < 10) { if (i % 2 == 0) { continue; // 导致i永远不增加! } i++; } -
嵌套循环
break误用for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (condition) break; // 仅跳出内层循环! } } -
数组越界访问
int arr[5] = {1,2,3,4,5}; for (int i = 0; i <= 5; i++) { // 最大下标为4! printf("%d", arr[i]); }
五、总结:循环选择决策模板
✅ 使用for循环当:
- 需要精确控制循环次数
- 需要自动管理循环变量
- 遍历数组/集合元素
✅ 使用while循环当:
- 循环次数不确定
- 需要持续检测外部条件(如传感器数据)
- 实现无限循环(配合
break)
✅ 使用do-while循环当:
- 必须至少执行一次循环体
- 需要先执行操作再验证条件(如用户输入校验)
✅ 使用break/continue当:
- 需要提前终止循环(
break) - 需要跳过特定条件的迭代(
continue)
🚫 避免以下操作:
- 在循环体内修改
for循环控制变量(破坏循环逻辑) - 嵌套超过3层的循环(应拆分子函数)
- 使用浮点数作为循环计数器
终极心法:循环就像时间的齿轮——合理的控制能让它们精准运转,失控的循环则会吞噬你的程序! ⏳