C 语言 while
和 do...while
循环学习笔记
一、基本语法对比
循环类型 | 语法结构 | 执行特点 |
---|---|---|
while | c<br>while (条件表达式) {<br> // 循环体<br>} | 先判断条件,后执行循环体(0~N次) |
do...while | c<br>do {<br> // 循环体<br>} while (条件表达式); | 先执行循环体,后判断条件(1~N次) |
二、执行流程图解
-
while
循环流程开始 → 检查条件 → [true]→ 执行循环体 → 回到条件检查 ↓ [false] 结束
-
do...while
循环流程开始 → 执行循环体 → 检查条件 → [true]→ 回到循环体 ↓ [false] 结束
三、核心应用场景
-
while
典型用例- 不确定次数的循环
int num; while (scanf("%d", &num) != EOF) { // 持续读取输入直到文件结束 }
- 事件驱动型循环
while (传感器数据未达标) { 调整设备参数(); }
- 不确定次数的循环
-
do...while
典型用例- 必须执行一次的输入验证
char choice; do { printf("是否继续?(y/n): "); scanf(" %c", &choice); } while (choice != 'y' && choice != 'n');
- 重试机制
int retry_count = 0; do { if (发送数据() == SUCCESS) break; retry_count++; } while (retry_count < 3);
- 必须执行一次的输入验证
四、关键差异与注意事项
-
执行次数保证
while
:可能完全不执行循环体do...while
:至少执行一次循环体
-
分号规则
while (条件); // ← 错误!会导致空循环 do {...} while (条件); // ← 必须带分号
-
循环变量控制
int i = 3; while (i < 5) { printf("%d ", i); // 输出:3 4 i++; // 必须手动更新变量 } int j = 10; do { printf("%d ", j); // 输出:10 } while (j < 5); // 尽管条件不成立仍执行一次
-
避免死循环
while (1) { ... } // 经典无限循环 do { ... } while (1); // 等效写法 // 需配合 break 退出
-
浮点数比较风险
double val = 0.0; while (val != 1.0) { // 可能因精度问题无法终止 val += 0.1; }
五、性能与调试建议
-
优化技巧
- 将复杂条件计算移到循环外:
int max = calculate_max_value(); // 替代 while (i < calculate_max_value()) while (i < max) { ... }
- 将复杂条件计算移到循环外:
-
调试方法
- 添加状态打印:
int count = 0; while (condition) { printf("[DEBUG] 第%d次循环,变量值=%d\n", ++count, var); // ... }
- 使用调试器观察条件表达式变化
- 添加状态打印:
六、对比总结表
特征 | while | do...while |
---|---|---|
执行顺序 | 先判断后执行 | 先执行后判断 |
最小执行次数 | 0 | 1 |
适用场景 | 需要前置条件校验的场景 | 必须执行一次的场景 |
代码可读性 | 条件优先时更直观 | 强调首次必须执行时更清晰 |
使用频率 | 较高 | 较低 |