Java数组元素自增操作两段for循环输出差异问题咨询
问题原因分析
核心原因是两个点的叠加:
- 后置自增运算符
i++的特性是先返回变量当前值,再对变量执行+1操作 - for循环的增量语句和循环体内部的
i++会在每次迭代中给i累计加2,步长为2自然只会访问偶数下标
第二个for循环执行流程拆解
我们先明确Java中for循环的标准执行顺序:
- 执行初始化语句
int i = 0(仅首次循环执行一次) - 判断条件
i < arrayExample.length,结果为true才执行循环体,为false直接终止循环 - 执行循环体代码
- 执行for循环自带的增量语句
i++,回到第2步重新判断条件
数组长度为5,下标范围0~4,第二个循环的完整执行过程如下:
| 迭代次数 | 进入循环时i的值 | 条件判断结果 | 循环体arrayExample[i++]++执行逻辑 | 循环体执行后i的值 | 执行for增量i++后i的值 | 被修改的数组下标 |
|---|---|---|---|---|---|---|
| 1 | 0 | 0<5 → true | 先取i当前值0作为下标,给下标0元素自增,再给i+1 | 1 | 2 | 0 |
| 2 | 2 | 2<5 → true | 先取i当前值2作为下标,给下标2元素自增,再给i+1 | 3 | 4 | 2 |
| 3 | 4 | 4<5 → true | 先取i当前值4作为下标,给下标4元素自增,再给i+1 | 5 | 6 | 4 |
| 4 | 6 | 6<5 → false | 不执行 | - | - | 无 |
整个过程中只有下标0、2、4的元素被访问修改,下标1、3从未被循环体触碰,所以值保持不变。
认知误区说明
你之所以会误以为会修改下标1、3的元素,大概率是混淆了前置自增++i和后置自增i++的逻辑,或是忽略了for循环本身自带一次i++增量:如果循环体里写的是arrayExample[++i]++,那就会先给i加1再取下标,此时修改的就是下标1、3的元素,还会因为i最后越界抛出ArrayIndexOutOfBoundsException异常。
内容的提问来源于stack exchange,提问作者Aleksandar
相关产品推荐
相关产品推荐

