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

数组子数组求和代码异常:前置自增导致结果不符的原因解析

两段数组子数组和计算代码的差异原因解析

问题说明

有两段看起来逻辑一致的数组子数组和计算代码,运行结果却截然不同:用测试数组(1,2,3,4)验证时,预期输出为6,9,12,第一段代码输出6,8,10(错误),第二段代码输出6,9,12(正确)。

代码对比

错误代码片段

while(i<vec.size()-1){
  sum += -vec[i-2] + vec[++i] ;
  nums.emplace_back(sum);
}
return nums;

正确代码片段

while(i<vec.size()-1){
  sum += -vec[i-2] + vec[i+1] ;
  nums.emplace_back(sum);
  i++;
}
return nums;

核心差异原因

问题出在前置自增++i的执行时机:

  • 错误代码中,sum += -vec[i-2] + vec[++i]这个表达式里,++i会先修改i的值,再执行表达式内的其他运算。这导致vec[i-2]使用的是自增后的i值,而非循环开始时的原始i值,直接破坏了滑动窗口的计算逻辑(本该减去当前窗口最左端元素,再加上下一个右端元素得到新窗口的和)。
  • 正确代码中,vec[i+1]基于循环初始的i值计算,整个表达式的所有数组访问都使用当前循环的i值,计算完成后才在循环末尾执行i++,完全符合滑动窗口的预期逻辑。

测试用例分步验证(假设初始状态:sum=6,i=2,nums已存入第一个结果6)

错误代码第一次循环

  1. 先执行++i,i从2变为3
  2. 计算-vec[i-2] → 此时i为3,取vec[1]即2,结果为-2
  3. 取vec[3]即4
  4. sum更新为6 + (-2+4)=8,存入nums后数组变为[6,8]
  5. 第二次循环i=3,不满足i<3(数组长度为4,vec.size()-1=3),循环提前结束,最终结果既少值又错误。

正确代码第一次循环

  1. 计算-vec[i-2] → i为2,取vec[0]即1,结果为-1
  2. 取vec[i+1]即vec[3]=4
  3. sum更新为6 + (-1+4)=9,存入nums后数组变为[6,9]
  4. 执行i++,i从2变为3
  5. 后续循环继续基于正确的i值逻辑执行,最终得到符合预期的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:22:08