为何代码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:
- 初始
i=0,进入循环条件时,先执行++i,i变成1; - 然后分别读取
str[i](此时i=1,值为'h')和str[i](同样i=1,值为'h'); - 比较结果为真,循环继续;
- 下一轮循环重复上述步骤:
++i让i变成2,比较str[2]和str[2],依然相等; - 直到i增长到3时,
++i让i变成4,比较str[4]('a')和str[4]('a'),还是相等; - 当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
相关产品推荐
相关产品推荐

