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

C语言for循环条件顺序异常:调换顺序可恢复正常

问题原因分析:逻辑与的短路求值特性

这是C语言中&&运算符的短路求值特性导致的典型问题,核心差异在于循环条件的判断顺序:

崩溃代码的问题

for (i = 0; ((values[i] != 0xffffffff) && (i < total)); i++)

当数组被完全填充有效值时,所有values[i]都不等于0xffffffff。循环会持续执行,直到i增长到400——此时程序会先执行values[400] != 0xffffffff,但数组的合法下标范围是0~399,访问values[400]属于数组越界访问,这是C语言的未定义行为:可能直接触发崩溃,也可能破坏内存中的其他数据,最终导致i继续超出400的范围。

正常代码的原理

for (i = 0; ((i < total) && (values[i] != 0xffffffff)); i++)

这里把i < total放在&&的左侧,利用短路求值特性:当i等于400时,i < total为假,&&右侧的values[i]不会被执行,循环直接终止。既避免了数组越界,也保证i不会超出total的范围。

额外提醒

数组越界是C语言中非常危险的未定义行为,表现可能随机(有时甚至看似正常),但始终违反语言规范。这类问题的核心解法就是先判断下标合法性,再访问数组元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:18:11