为何foreach循环在此场景下计算数组平方和结果错误?
问题原因及两种循环机制解析
问题代码的错误原因
先看出现问题的增强for循环实现:
public class Kata { public static int squareSum(int[] n) { int sum = 0; for (int i : n) { sum += n[i] * n[i]; } return sum; } }
当输入数组为{1,2,2}时,这段代码的执行过程是:
- 第一次循环:
i取数组第一个元素的值1,然后访问n[1](即数组第二个元素2),平方后加到sum,sum变为4。 - 第二次循环:
i取数组第二个元素的值2,访问n[2](数组第三个元素2),平方后加到sum,sum变为8。 - 第三次循环:
i取数组第三个元素的值2,再次访问n[2](值为2),平方后加到sum,sum变为12。
核心错误是:增强for循环中的变量i是数组的元素值,而非索引,但代码错误地将它当作索引去访问数组元素,导致每次取的不是当前元素的平方,而是另一个元素的平方,最终结果偏离预期。
正确代码的逻辑
普通for循环的实现是正确的:
public class Kata { public static int squareSum(int[] n) { int sum = 0; for (int i = 0; i < n.length; i++) { sum += n[i] * n[i]; } return sum; } }
执行过程:
i从0开始,依次作为数组的索引:i=0时,取n[0]=1,平方后sum变为1;i=1时,取n[1]=2,平方后sum变为5;i=2时,取n[2]=2,平方后sum变为9,符合预期。
两种循环的工作机制
增强for循环(for-each循环)
- 语法形式:
for (元素类型 变量名 : 数组/可迭代集合) - 工作原理:直接遍历目标数组或集合中的每一个元素,循环变量代表当前迭代到的元素值,而非元素的索引位置。
- 优势:代码简洁,无需手动管理索引,避免索引越界的风险(只要集合本身合法)。
- 局限性:无法直接获取元素的索引,也无法在遍历过程中修改数组的长度(对于集合则视具体类型而定)。
普通for循环
- 语法形式:
for (初始化索引变量; 循环终止条件; 索引更新规则) - 工作原理:通过手动控制索引变量的变化,逐个访问数组的元素(
数组[索引])。索引从起始值开始,每次循环后按规则更新,直到满足终止条件时停止。 - 优势:完全掌控索引的变化,可以灵活地按任意顺序访问元素,也能直接修改数组元素的值。
- 局限性:需要手动处理索引的边界,容易出现索引越界(比如
i <= n.length的错误)。
内容的提问来源于stack exchange,提问作者stacktrace
相关产品推荐
相关产品推荐

