2.4循环控制与实战

127 阅读3分钟

循环控制与实战 ——让代码拥有重复执行的力量


一、循环三剑客:场景决定选择

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=12=2   2×2=43=3   2×3=6   3×3=9  
...(略)  

四、避坑指南:5个致命错误

  1. 死循环陷阱

    while (1) {          // 正确退出方式需内部break  
        if (condition)  
            break;  
        // 忘记更新循环条件变量  
    }  
    
  2. 浮点循环计数器

    for (float f = 0.1; f != 1.0; f += 0.1) {} // 可能无限循环!  
    
  3. continue跳过变量更新

    int i = 0;  
    while (i < 10) {  
        if (i % 2 == 0) {  
            continue;  // 导致i永远不增加!  
        }  
        i++;  
    }  
    
  4. 嵌套循环break误用

    for (int i = 0; i < 5; i++) {  
        for (int j = 0; j < 5; j++) {  
            if (condition)  
                break;  // 仅跳出内层循环!  
        }  
    }  
    
  5. 数组越界访问

    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层的循环(应拆分子函数)
  • 使用浮点数作为循环计数器

终极心法:循环就像时间的齿轮——合理的控制能让它们精准运转,失控的循环则会吞噬你的程序! ⏳