許多 Java 初學者在撰寫迴圈時,會疑惑為何將累加變數 sum 宣告在 for 迴圈的初始化區塊中會導致編譯錯誤,而宣告在迴圈外部則正常運作。這其實涉及 Java 變數作用域的核心機制。
for (int i = 0, sum = 0; i < score.length; i++) {
// 迴圈邏輯
}
System.out.println("平均分為:" + sum / 5.0); // 編譯錯誤:找不到符號 sum
在 for 迴圈的初始化區塊宣告的變數,其作用域僅限於該迴圈內部。編譯器會將其視為區塊變數,等同於以下結構:
{
int i = 0, sum = 0;
for (; i < score.length; i++) {
// 迴圈體
}
}
// 此處 sum 已超出作用域,被垃圾回收器回收
for (int i = 0, sum = 0; i < 5; i++) {
sum += i;
}
// System.out.println(sum); // 編譯失敗
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += i;
}
System.out.println("總和:" + sum); // 正常輸出
若寫成 for (int i, sum = 0; ...) 會導致 i 未初始化而報錯。Java 區域變數必須顯式初始化才能使用,不像成員變數有預設值。
若堅持將變數宣告在迴圈內,可在迴圈結束前輸出:
for (int i = 0, sum = 0; i < score.length; i++) {
sum += score[i];
if (i == score.length - 1) {
System.out.println("平均分為:" + sum / 5.0);
}
}