for循环终止异常排查:三目运算符设置循环边界失效
问题出在运算符优先级,导致循环条件完全不符合你的预期!
你遇到的核心问题是C语言的运算符优先级规则把你的循环条件逻辑彻底搞歪了,导致循环永远不会终止——因为你的for循环第二个表达式永远返回非零值(4或10),而C语言里非零值就代表"真",循环会一直跑下去。
为什么会这样?
先看你写的循环条件:
i < ((end_jump % 3) == 0) ? 4 : 10
C语言中,关系运算符(<、==)的优先级高于条件运算符?:,所以编译器会把这个表达式解析成:
(i < ((end_jump % 3) == 0)) ? 4 : 10
而((end_jump % 3) == 0)的结果是布尔值,在C里会被转换成整数1(真)或0(假)。
我们分两种情况看:
- 当
end_jump=3时,((end_jump%3)==0)是1,表达式变成(i < 1) ?4:10。当i=0时,返回4(非零,循环继续);当i>=1时,返回10(还是非零,循环继续)。 - 当
end_jump=7时,((end_jump%3)==0)是0,表达式变成(i <0) ?4:10。因为i从0开始递增,永远不会小于0,所以一直返回10(非零,循环继续)。
不管哪种情况,循环的判断条件永远是非零,自然不会终止。
怎么修复?
给整个条件运算符表达式加上括号,强制让它先计算出循环的边界值,再和i比较:
int i; for(i = 0; i < ((end_jump % 3) == 0 ? 4 : 10); i++){ /* do something with */ array[i]; }
这样编译器会先执行((end_jump%3)==0 ?4:10),得到正确的边界(4或10),然后判断i是否小于这个边界,循环就能正常终止了:
- 当
end_jump=3时,循环会在i=4时停止(执行i=0到3共4次) - 当
end_jump=7时,循环会在i=10时停止(执行i=0到9共10次)
额外提示
写复杂表达式时,不要依赖对运算符优先级的记忆——直接加括号明确你的逻辑,既不容易出错,也让代码更易读。
内容的提问来源于stack exchange,提问作者itzFlubby
相关产品推荐
相关产品推荐

