社交媒体

循环for 和 while 怎么选?

循环for 和 while 怎么选?

钩子

给你个任务:打印 1 到 100。

复制 100 行 System.out.println 也行,就是交完这份代码,你可能会被自己劝退。而循环只要 3 行:

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

循环是程序第一次"自己干活"。前面学的 if-else 让程序会"选择",循环让程序会"重复"——加上这两个,程序才算有了脑子和小腿。

01 for:把执行顺序拆开看

for (int i = 1; i <= 100; i++) 这行看着挤,其实是三段:

  1. 初始化:int i = 1,只执行一次
  2. 条件:i <= 100,每轮开始前检查,不满足就停
  3. 更新:i++,每轮循环体执行完后才跑

顺序是:初始化 → 条件 → 循环体 → 更新 → 条件 → 循环体 → 更新……更新是在循环体之后,这个顺序搞反了,很多现象就解释不了。

10-for执行顺序图.png

02 while 和 do-while:先看门 vs 先进门

while 更简单,只有条件:

int n = 100;
while (n > 0) {
    System.out.println(n);
    n--;
}

注意 n-- 必须有——忘了更新条件变量,循环永远停不下来,这就是死循环,CPU 直接拉满。

do-while 是变种:先执行一次循环体,再判断条件。"先看门再进门"和"先进门再看门"的区别:

do {
    System.out.println("至少执行一次");
} while (false);

条件是 false 也照样跑了一遍。用它的情况不多,但读到别人的代码得认识它——比如"先让用户输入,再检查输入对不对"。

03 break 和 continue:紧急出口和跳过本轮

10-break与continue对比图.png

for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break;       // 整个循环到此结束
    }
    if (i % 2 == 0) {
        continue;    // 跳过本轮,直接进下一轮
    }
    System.out.println(i);
}

输出:1、3。到 5 直接 break 整个循环终止;偶数被 continue 跳过不打印。break 是紧急出口,continue 是跳过本轮,别混。

04 for 和 while 怎么选 + 两个坑

一句话:知道循环几次,用 for;不知道几次、只知道条件,用 while。 打印 1 到 100 用 for;"一直读用户输入直到输入 quit"用 while。

顺便回答标题那个问题:while (true) 不是 bug,是服务器的日常——服务器就是个巨大的死循环,等请求、处理、再等。退出靠的是 break 或异常,不是条件变 false。

两个新手高频坑:

坑 1:边界差一(off-by-one)。i < 100 打印 99 个数,i <= 100 打印 100 个。写完循环先问自己:第一轮 i 是几?最后一轮 i 是几?

坑 2:在循环体里改循环变量。for 循环里手滑写个 i++,一轮走两步,结果对不上还找不到原因。循环变量只归 for 括号管。


本文示例代码均已本地实测通过,可直接运行。
对应文件:LoopDemo.java


橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。