第 04 课:for、while、break 与 continue

2 阅读4分钟

第 04 课:for、while、break 与 continue

本课目标

学完后,你应该能够:

  1. for 重复固定或可计算次数的任务。
  2. while 处理次数暂不确定的任务。
  3. 理解 do-while 至少执行一次的特点。
  4. 使用 break 结束循环,使用 continue 跳过本轮。
  5. 使用计数器和累加器解决实际问题。
  6. 识别死循环和常见的边界错误。

1. for 循环

输出 1 到 5:

for (int i = 1; i <= 5; i++) {
    System.out.println(i);
}

执行顺序:

  1. int i = 1:只执行一次,创建循环变量。
  2. i <= 5:每轮开始前检查;为 false 时结束。
  3. 执行 {} 中的循环体。
  4. i++:本轮结束后让 i 增加 1。
  5. 回到第 2 步。

i++ 等价于:

i = i + 1;

2. 计数器和累加器

计算 1 到 100 的总和:

int sum = 0;
​
for (int i = 1; i <= 100; i++) {
    sum = sum + i;
}
​
System.out.println(sum); // 5050
  • i 是计数器,控制当前轮次。
  • sum 是累加器,保存此前所有轮次的结果。

累加器必须放在循环外声明,否则每轮都会重新变成 0。

3. while 循环

当循环次数取决于某个条件时,while 很自然:

int energy = 3;
​
while (energy > 0) {
    System.out.println("继续学习,剩余精力:" + energy);
    energy--;
}

每轮先判断,再执行。因此一开始条件就是 false 时,循环体一次也不执行。

警惕死循环:

int number = 1;
while (number <= 5) {
    System.out.println(number);
    // 忘记 number++,条件永远为 true
}

4. do-while 循环

do-while 先执行一次,再判断条件:

int number = 10;
​
do {
    System.out.println(number);
    number++;
} while (number < 5);

虽然 number < 5 一开始就是假,程序仍输出一次 10。它常用于“至少显示一次菜单,然后询问是否继续”。

注意结尾有分号:while (条件);

5. break 与 continue

break 立即结束整个循环:

for (int i = 1; i <= 100; i++) {
    if (i == 5) {
        break;
    }
    System.out.println(i); // 只输出 1、2、3、4
}

continue 只跳过当前这一轮:

for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        continue;
    }
    System.out.println(i); // 不输出 3
}

6. 嵌套循环

循环里面还可以有循环:

for (int row = 1; row <= 3; row++) {
    for (int column = 1; column <= 3; column++) {
        System.out.print(row + "," + column + "  ");
    }
    System.out.println();
}

外层每执行一轮,内层都会完整执行 3 轮,因此总共执行 3 × 3 = 9 次。

7. 完整示例

运行 LoopBasics.java,它展示:

  • 1 到 100 累加;
  • 使用 continue 跳过奇数;
  • 使用 while 倒计时;
  • 使用 do-while 至少执行一次。

8. 独立练习一:猜数字游戏(完整答案)

运行 GuessNumberGame.java

  • 随机生成 1–100 的答案;
  • 最多猜 7 次;
  • 每次提示太大或太小;
  • 猜中使用 break 提前结束;
  • 输入超出范围时使用 continue,但仍消耗一次机会。

核心循环:

while (attempts < maxAttempts) {
    attempts++;
    int guess = scanner.nextInt();
​
    if (guess == target) {
        guessed = true;
        break;
    } else if (guess < target) {
        System.out.println("太小了");
    } else {
        System.out.println("太大了");
    }
}

9. 独立练习二:九九乘法表(完整答案)

运行 MultiplicationTable.java。外层循环控制行,内层循环从 1 运行到当前行:

for (int row = 1; row <= 9; row++) {
    for (int column = 1; column <= row; column++) {
        System.out.print(column + "×" + row + "=" + (column * row) + "\t");
    }
    System.out.println();
}

10. 常见错误

少一次或多一次

i < 5   // i 为 1 时,执行 1、2、3、4
i <= 5  // 执行 1、2、3、4、5

这种错误称为 off-by-one error(差一错误)。重点检查初始值、比较符号和终点。

在循环内重置累加器

for (int i = 1; i <= 10; i++) {
    int sum = 0; // 错误:每轮重新创建
    sum += i;
}

while 忘记更新条件变量

条件永远为真时会形成死循环。IDEA 中可以点击红色停止按钮终止程序。

11. 检查题与答案

问题

  1. for (int i = 0; i < 5; i++) 一共执行几轮?i 分别是多少?
  2. breakcontinue 有什么区别?
  3. whiledo-while 的核心区别是什么?
  4. 为什么累加器通常在循环外初始化?
  5. 两层循环各执行 4 次,最内层代码总共执行多少次?

答案

  1. 执行 5 轮,i 分别是 0、1、2、3、4
  2. break 结束整个循环;continue 只跳过当前轮,随后进入下一轮。
  3. while 先判断,可能一次不执行;do-while 先执行,至少执行一次。
  4. 如果在循环内初始化,每一轮都会清零,无法保留之前的累计结果。
  5. 4 × 4 = 16 次。

12. 本课完成标准

  • 能独立写出 1 到 100 的累加。
  • 能解释何时用 for、何时用 while
  • 能正确使用 breakcontinue
  • 能看懂两层嵌套循环。
  • 能检查 <<= 引起的边界差异。

下一课学习方法:把重复逻辑封装成可复用、可传参、可返回结果的代码块。