for 循环:三段式
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
圆括号里用分号隔开的三段,各管一件事:
int i = 0—— 初始化,循环开始前执行一次i < 5—— 条件,每轮开始前检查,成立才进循环体i++—— 步进,每轮结束后执行
i++ 就是 i = i + 1。执行顺序是:① → ② → 循环体 → ③ → ② → 循环体 → ③ → … 直到 ② 不成立。
把这个顺序在脑子里过一遍,以后所有 for 循环你都能手推出结果。
遍历数组:增强 for
int[] scores = {88, 92, 79};
for (int i = 0; i < scores.length; i++) {
System.out.println(scores[i]);
}
// 不需要下标时,用增强 for,更清楚也更不容易错
for (int score : scores) {
System.out.println(score);
}
读作"对 scores 里的每一个 score"。注意数组长度用 .length(没有括号),字符串长度用 .length()(有括号),这俩经常写混。
while 和 do-while
int count = 0;
while (count < 5) {
System.out.println(count);
count++; // 忘了它就是死循环
}
do {
System.out.println("至少执行一次");
} while (false);
区别是 do-while 先执行再判断,所以循环体至少跑一次。适合"先让用户输入一次,再判断合不合法"。
break 与 continue
for (int i = 0; i < 10; i++) {
if (i == 5) break; // 跳出整个循环
if (i % 2 == 0) continue; // 跳过本轮剩余部分
System.out.println(i); // 1 3
}
嵌套循环:九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.printf("%d×%d=%-4d", j, i, i * j);
}
System.out.println();
}
外层走一轮,内层完整走一遍。理解嵌套循环的关键是:内层是外层的循环体的一部分。%-4d 表示左对齐占 4 格,让表格对齐。
累加器套路
int total = 0;
for (int i = 1; i <= 100; i++) {
total += i;
}
System.out.println(total); // 5050
求和、计数、找最值都是这个骨架:循环外准备容器,循环内更新它。
int[] nums = {3, 9, 1, 7};
int max = nums[0]; // 先假设第一个最大
for (int n : nums) {
if (n > max) max = n; // 见到更大的就换
}
注意 max 的初值取 nums[0] 而不是 0——如果数组里全是负数,初值取 0 就错了。初值怎么定,是这类算法唯一容易错的地方。
10 秒自测
for (int i = 0; i < 3; i++);
System.out.println(i);
这段有什么问题?
for 后面多了个分号,循环体变成了空语句,println 根本不在循环里——而且 i 已经出了作用域,编译直接报错。多余的分号是一类很难用眼睛发现的 bug。