You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何代码while (str[i] == str[++i]);会陷入无限循环?

为什么while (str[i] == str[++i]);会导致无限循环?

你的问题核心在于C语言中表达式的求值顺序存在未定义行为,具体来说,在同一个比较表达式里同时读取和修改变量i,会让逻辑完全偏离预期:

分析while (str[i] == str[++i]);的执行逻辑

在这个循环条件中,str[i]和str[++i]属于同一个表达式的两个操作数。C标准并没有规定这两个操作数的求值顺序——编译器可以选择先计算++i,再计算str[i],也可以反过来。

在你的测试场景里,编译器实际选择了先执行++i:

  1. 初始i=0,进入循环条件时,先执行++i,i变成1;
  2. 然后分别读取str[i](此时i=1,值为'h')和str[i](同样i=1,值为'h');
  3. 比较结果为真,循环继续;
  4. 下一轮循环重复上述步骤:++i让i变成2,比较str[2]和str[2],依然相等;
  5. 直到i增长到3时,++i让i变成4,比较str[4]('a')和str[4]('a'),还是相等;
  6. 当i增长到5时,++i让i变成6,str[6]属于越界内存,但此时比较的是str[6]和str[6],依然相等(哪怕是随机值,自己和自己也相等),所以循环永远不会终止,陷入无限循环。

分析while (str[i++] == str[i]) ;的问题

这种写法同样存在未定义行为:str[i++]是后置自增,str[i]的求值顺序依然不确定。比如编译器可能先计算str[i](当前i的值),再计算str[i++],导致比较的是同一个位置的字符,结果永远为真,同样陷入无限循环。

正确写法的合理性

你给出的正确代码:

while (str[i] == str[i+1]) i++;
i++;

这里的逻辑完全清晰:

  • 每次循环只读取i和i+1的位置,没有在同一个表达式里修改i,求值顺序明确;
  • 当str[i]和str[i+1]不同时退出循环,此时i+1就是第一个与str[i]不同的位置,最后执行i++得到目标索引,逻辑完全符合预期。

内容的提问来源于stack exchange,提问作者Seoyeon Oh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:10:31