为什么调换for循环中&&两个条件的顺序会导致程序无法通过测试?
问题原因
核心是C语言中逻辑与运算符&&的短路求值规则:
&&从左到右依次判断两侧条件,只要左侧条件判定为假,就会直接终止判断流程,不会执行右侧的条件表达式。
两个写法的差异
- 报错的写法:
for(i=2980;(bin[i]==0)&&(i>=0);i--);
当循环执行到i=-1时,会优先执行bin[i]==0判断,此时i=-1已经超出数组bin的合法下标范围,属于数组越界访问,是未定义行为:可能读取到非法内存的脏值导致逻辑错误,也可能直接触发程序崩溃,自然无法通过测试。
- 可通过的写法:
for(i=2980;i>=0&&bin[i]==0;i--);
每次循环都会先检查i>=0是否成立,当i减到-1时,左侧条件直接判定为假,&&触发短路,不会执行后续的bin[i]==0判断,完全规避了数组越界风险,逻辑完全合法,因此可以正常通过测试。
内容的提问来源于stack exchange,提问作者luminous
相关产品推荐
相关产品推荐

