在C语言中有三种主要的循环结构:for、while和do-while。它们的出现与重复计算的需求、简化数据结构的遍历以及自动化数组处理相关。第一次循环语法出现在早期的编程语言(Algol、Fortran)中,并根据C的语法进行了调整,以提高可读性和控制流。
问题背景
最初,程序员使用标签和goto组织重复动作,这很快导致代码变得混乱(意大利面条代码)。自1972年起,在C语言中引入的结构化循环使得重复和描述程序逻辑的方法得以统一。
问题
循环的主要任务是确定某个特定动作应该重复多少次,以及如何控制退出循环。根据是否提前知道重复次数、是否至少需要执行一次循环体,以及是否需要提前计算退出条件,选择循环类型是非常重要的。
解决方案
代码示例:
#include <stdio.h> int main() { int i = 0; // while循环示例 while (i < 3) { printf("while: %d\n", i); i++; } // for循环示例 for (int j = 0; j < 3; j++) { printf("for: %d\n", j); } // do-while循环示例 int k = 0; do { printf("do-while: %d\n", k); k++; } while (k < 3); return 0; }
关键特性:
while(1)和for(;;)之间有什么区别?在无限循环中哪个使用更好?
回答:这两种形式都会创建无限循环并转化为相同的机器代码,性能上没有区别。通常使用for(;;)来明确显示不需要初始化、退出条件或步长。
for(;;) { // 无限循环 } // 或者 while(1) { // 无限循环 }
可以在for循环体内修改循环变量吗?会发生什么?
回答:在for循环体内修改计数变量(例如i++)会导致不可预测的迭代次数。这种修改会使阅读者感到困惑,并增加调试的难度。
for (int i = 0; i < 10; i++) { printf("%d\n", i); i += 2; // 非标准的步长修改! }
如果将循环体留空,会发生什么?在什么情况下是合理的?
回答:空循环体是允许的,用于等待事件发生或准备数据:
while(*src++ = *dst++); // 复制字符串直到字符'\0'
消极案例
项目中使用for并在循环体内修改计数变量,导致处理元素数量错误、出现错误并增加了调试困难。
优点:
缺点:
积极案例
使用for遍历固定长度的数组,没有在外部修改计数器:
优点:
缺点: