不二如是 发表于 2025-6-2 17:43:57

秒懂「死循环」for(int i=0;;i++)



死循环(Infinite Loop)指程序在运行过程中,循环体(如 for、while、do…while 等)永远无法满足跳出条件,导致程序持续重复执行同一段代码,永不结束的情况。

通俗地说:

**** Hidden Message *****

在线感受:

https://www.bilibili.com/video/BV1mB7mzCEUJ

无限循环 ≠ 正常循环。

正常循环:在一定条件下会自动结束,如执行固定次数或满足特定退出条件。

死循环:循环条件永远为真或无法到达退出状态,无限次地执行下去。

为什么会产生死循环?

1、编码疏忽
漏写循环变量的更新语句(如忘记 i++、i--)。
逻辑判断写反(如 while (a > b) 与预期的 while (a < b) 相反)。

2、需求设计不周全
要求程序持续监听某种状态,但没有设计退出机制或超时判定。
在多线程/异步场景中,等待某个信号/条件,但该条件永远不会被其他线程/代码更新。

3、边界条件未考虑
对边界值/极端情况判断不完整,导致无法跳出循环。
例如对浮点数或字符串进行比较时,循环条件可能永远为真或永远不满足。

4、过度依赖硬编码常量
把循环次数写死,但在逻辑迭代中却又无法改变常量,导致“死循环”或“永不执行”状态。


死循环的危害

CPU 占用过高:无限循环持续占用 CPU 资源,可能导致 CPU 利用率一直在 100%,影响同机其他进程或线程的正常运行。

内存泄露或资源耗尽:如果循环内部不断分配内存、打开文件或网络连接,却没有及时释放,就会引发内存泄露或文件句柄耗尽。

程序无响应/卡死:在 GUI 应用或 Web 后端中,死循环会让整个界面卡死、请求无法响应,用户体验极差。

服务器挂掉或崩溃:在服务器场景下,一个死循环服务进程可能占满系统资源,最终导致整台服务器崩溃或拒绝服务(DoS)。

逻辑错误难排查:死循环往往不报错,仅表现为“没有任何输出”或“进度停滞”,不易从日志中快速定位,调试成本高。

你还知道哪些死循环写法?

评论区聊聊你的想法吧{:10_330:}

https://xxx.ilovefishc.com/forum/202505/12/120451wiv7viv5iebupbbr.png

>>万能兑换C币许愿池<<

如果有收获,别忘了评分{:10_281:} :

https://xxx.ilovefishc.com/forum/202011/20/092334ggd6inlzfisfrdir.png.thumb.jpg
https://xxx.ilovefishc.com/forum/202505/21/111710rvxgdn90vaub5gag.gif                                                                  

不二如是 发表于 2025-6-2 17:44:33

感谢分享 朕又在鱼C学到东西啦!非常满意{:10_275:}

不二如是 发表于 2025-6-2 17:44:44

@FishC 如何减少死循环

FishC 发表于 2025-6-2 17:45:43

不二如是 发表于 2025-06-02 17:44
@FishC 如何减少死循环

在编程中,减少死循环的关键是确保循环有明确的终止条件。以下是实用方法:

### 1. **检查循环条件**
   - 确保循环条件最终会变为 false。
   - 示例:
   
   // 错误:i 未更新,死循环!
   int i = 0;
   while (i < 10) {
         printf("%d", i);
   }
   
   修正:
   
   int i = 0;
   while (i < 10) {
         printf("%d", i);
         i++; // 添加递增
   }
   

### 2. **设置循环计数器**
   - 对不确定次数的循环,添加计数器强制退出:
   
   int count = 0;
   while (复杂条件) {
         // 逻辑代码...
         count++;
         if (count > 10000) break; // 防止无限循环
   }
   

### 3. **避免外部依赖失控**
   - 若循环依赖外部输入(如用户/文件),需验证数据:
   
   int num;
   while (1) {
         printf("输入正数(0退出): ");
         scanf("%d", &num);
         if (num <= 0) break; // 明确退出条件
   }
   

### 4. **测试边界条件**
   - 特别测试边界值(如 0、负数、最大值):
   
   // 错误:当 n=0 时死循环
   for (int i = n; i > 0; i--) { ... }
   

### 5. **使用调试工具**
   - 用调试器(如 GDB、IDE 断点)观察变量变化,确认条件是否按预期更新。

### 6. **代码审查**
   - 重点检查:
   
   [*]循环条件是否可能永远为真
   [*]循环体内是否修改了条件变量
   [*]是否有 break 或 return 的遗漏
   

### 7. **替代方案**
   - 用 for 循环代替 while(更易控制):
   
   for (int i=0; i<max; i++) { ... } // 天然包含终止条件
   

---

总结: 始终确保循环内有 可变的终止条件,并对不可控因素(如用户输入)设置安全阀!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

player-none 发表于 2025-6-2 20:19:07

感谢分享 朕又在鱼C学到东西啦!非常满意{:10_275:}

死循环的好处远比坏处多.

不二如是 发表于 2025-6-2 20:28:16

player-none 发表于 2025-6-2 20:19
感谢分享 朕又在鱼C学到东西啦!非常满意

死循环的好处远比坏处多.

{:10_288:}{:10_288:}{:10_288:}

爬虫121 发表于 2025-6-2 22:26:25

感谢分享 朕又在鱼C学到东西啦!非常满意{:10_275:}
永动机的灵感可以从死循环这里寻找思路

快速收敛 发表于 2025-6-3 09:14:09

感谢分享 朕又在鱼C学到东西啦!非常满意{:10_275:}

置之死地而后生

鱼C-小师妹 发表于 2025-6-3 16:56:26

感谢分享 朕又在鱼C学到东西啦!非常满意{:10_275:}

不二如是 发表于 2025-6-3 17:01:06

快速收敛 发表于 2025-6-3 09:14
感谢分享 朕又在鱼C学到东西啦!非常满意

置之死地而后生

哈哈,死循环很容易直接把系统搞崩

不二如是 发表于 昨天 17:36

感谢分享 朕又在鱼C学到东西啦!非常满意{:10_275:}
页: [1]
查看完整版本: 秒懂「死循环」for(int i=0;;i++)