
在 java 的 for 循环中,当循环条件首次不满足时,控制变量会完成最后一次自减(或自增)操作,此时其值已超出有效范围——本例中,b 的最终值为 -1。
在 java 的 for 循环中,当循环条件首次不满足时,控制变量会完成最后一次自减(或自增)操作,此时其值已超出有效范围——本例中,b 的最终值为 -1。
我们来分析这段经典星号图案打印代码:
for (int b = 3; b >= 0; b--) {
System.out.println("");
for (int a = 0; a <p>该外层循环初始 <code>b = 3</code>,每次迭代末尾执行 <code>b--</code>,并在下一轮开始前检查 <code>b >= 0</code>。其完整执行过程如下:</p>
- 第1轮:
b = 3→ 满足条件 → 打印****→ 执行b--→b = 2 - 第2轮:
b = 2→ 满足条件 → 打印***→b = 1 - 第3轮:
b = 1→ 满足条件 → 打印**→b = 0 - 第4轮:
b = 0→ 满足条件 → 打印*→ 执行b--→b = -1 -
第5次判断:检查
b >= 0→-1 >= 0为false→ 循环终止
关键点在于:b-- 是在每次循环体执行完毕后、条件判断前执行的。因此,当 b 从 0 减至 -1 后,条件判断失败,循环退出,此时 b 的值确为 -1。
但由于原代码中 b 声明在 for 语句内(int b = 3),其作用域仅限于循环内部,循环结束后变量不可访问。若要验证该值,需将 b 提升至循环外部(即“hoist”变量):
int b;
for (b = 3; b >= 0; b--) {
System.out.println("*".repeat(b + 1)); // Java 11+,更简洁地替代内层循环
}
System.out.println("循环结束后 b = " + b); // 输出:-1
运行结果:
**** *** ** * -1
✅ 注意事项:
- 不要误认为循环在
b == 0打印后就立即停止;b--和条件判断是严格按序执行的两个独立步骤; - 若使用 Java 11 或更高版本,推荐用
String.repeat()简化内层逻辑,提升可读性与性能; - 在调试类似问题时,“提升循环变量作用域”是观察其终值的有效技巧,但生产代码中应权衡作用域最小化原则。
总结:循环终止时 b 的最终值是 -1,这是 for 循环执行机制决定的确定行为,而非巧合或边界误差。











