鱼C论坛

 找回密码
 立即注册
查看: 147|回复: 9

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

[复制链接]
发表于 前天 17:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
90540b65abfdd788ab75aed956cf3425ae9ee7c6.jpg@308w_174h.jpeg

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

通俗地说:

游客,如果您要查看本帖隐藏内容请回复


在线感受:



无限循环 ≠ 正常循环。

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

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

为什么会产生死循环?

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

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

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

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


死循环的危害

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

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

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

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

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

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


评论区聊聊你的想法



                               
登录/注册后可看大图




如果有收获,别忘了评分


                               
登录/注册后可看大图


                               
登录/注册后可看大图
                                                                    
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 前天 17:44 | 显示全部楼层
感谢分享 朕又在鱼C学到东西啦!非常满意
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 17:44 | 显示全部楼层
@FishC 如何减少死循环
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 17:45 | 显示全部楼层
不二如是 发表于 2025-06-02 17:44
@FishC 如何减少死循环


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

### 1. **检查循环条件**
   - 确保循环条件最终会变为 false
   - 示例:
   

  1.      // 错误:i 未更新,死循环!
  2.      int i = 0;
  3.      while (i < 10) {
  4.          printf("%d", i);
  5.      }
  6.      
复制代码

     修正:
   

  1.      int i = 0;
  2.      while (i < 10) {
  3.          printf("%d", i);
  4.          i++; // 添加递增
  5.      }
  6.      
复制代码


### 2. **设置循环计数器**
   - 对不确定次数的循环,添加计数器强制退出:
   

  1.      int count = 0;
  2.      while (复杂条件) {
  3.          // 逻辑代码...
  4.          count++;
  5.          if (count > 10000) break; // 防止无限循环
  6.      }
  7.      
复制代码


### 3. **避免外部依赖失控**
   - 若循环依赖外部输入(如用户/文件),需验证数据:
   

  1.      int num;
  2.      while (1) {
  3.          printf("输入正数(0退出): ");
  4.          scanf("%d", &num);
  5.          if (num <= 0) break; // 明确退出条件
  6.      }
  7.      
复制代码


### 4. **测试边界条件**
   - 特别测试边界值(如 0负数最大值):
   

  1.      // 错误:当 n=0 时死循环
  2.      for (int i = n; i > 0; i--) { ... }
  3.      
复制代码


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

### 6. **代码审查**
   - 重点检查:
     

         
  • 循环条件是否可能永远为真
         
  • 循环体内是否修改了条件变量
         
  • 是否有 breakreturn 的遗漏
         


### 7. **替代方案**
   - 用 for 循环代替 while(更易控制):
   

  1.      for (int i=0; i<max; i++) { ... } // 天然包含终止条件
  2.      
复制代码


---

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 20:19 | 显示全部楼层
感谢分享 朕又在鱼C学到东西啦!非常满意

死循环的好处远比坏处多.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 20:28 | 显示全部楼层
player-none 发表于 2025-6-2 20:19
感谢分享 朕又在鱼C学到东西啦!非常满意

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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 22:26 | 显示全部楼层
感谢分享 朕又在鱼C学到东西啦!非常满意
永动机的灵感可以从死循环这里寻找思路
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 09:14 | 显示全部楼层
感谢分享 朕又在鱼C学到东西啦!非常满意

置之死地而后生
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 16:56 | 显示全部楼层
感谢分享 朕又在鱼C学到东西啦!非常满意
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 17:01 | 显示全部楼层
快速收敛 发表于 2025-6-3 09:14
感谢分享 朕又在鱼C学到东西啦!非常满意

置之死地而后生

哈哈,死循环很容易直接把系统搞崩
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-4 12:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表