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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:55:09