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

为何C# LINQ代码中j--与--j抛异常,而j-1可正常运行?

问题原因解析

首先明确核心逻辑:doors是长度为100的数组,合法索引范围是0~99,而j的取值是1~100,所以需要将j转换为j-1来匹配数组索引。

你尝试的两种写法之所以报错,根源在于自增/自减运算符会修改变量本身的值,且同一表达式中多次使用会导致索引计算错误:

1. 关于.ForEach(j => doors[--j] = !doors[--j]);

--j是前置递减运算符,执行时会先把j的值减1,再使用新值。在这个表达式里,左右两边各执行了一次--j:

  • 当j=1时,先执行右边的--j,j变成0,访问doors[0];接着执行左边的--j,j变成-1,此时访问doors[-1]直接触发索引越界。
  • 即使j是更大的数,两次递减也会让最终的索引比预期小1,逻辑完全偏离需求,最终仍会在某些场景下触发越界。

2. 关于.ForEach(j => doors[j--] = !doors[j--]);

j--是后置递减运算符,执行时先使用j的当前值,再把j减1。同样因为表达式中两次使用j--:

  • 当j=100时,先执行右边的j--,会先用j=100作为索引访问doors[100],但数组最大索引是99,直接触发越界异常。
  • 即使j不是100,比如j=2,右边会先用j=2访问doors[2],然后j变成1;左边再用j=1访问doors[1],赋值逻辑完全不符合需求(原本应该是修改doors[1]一次,现在变成把doors[2]的反值赋给doors[1])。

为什么j-1可以正常工作?

j-1只是对j的值进行一次减法计算,不会修改j本身,无论写多少次(这里虽写了两次),都是用j的原始值减1:比如j=100时,100-1=99,正好是数组的最后一个合法索引;j=1时,1-1=0,也是合法索引,完全匹配需求。

内容的提问来源于stack exchange,提问作者J. Mini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:55:40