为何两段Java for循环代码输出12345而非01234?
为什么这两段Java for循环输出是12345而非期望的01234?
期望输出:01234
两段问题代码:
第一段:
for(int i = 0;i < 5; i++, System.out.print(i));
第二段:
for(int i = 0;i < 5; System.out.print(i)) i++;
实际输出:12345
核心原因:没搞懂Java for循环的执行顺序
Java的for循环严格遵循以下执行流程:
- 仅执行一次初始化表达式(比如
int i = 0) - 计算条件判断表达式(比如
i < 5):结果为true则进入循环体,为false直接结束循环 - 执行完循环体后,执行所有更新表达式(for循环第三个分号后的代码)
- 回到步骤2,重复判断逻辑
拆解第一段代码的执行过程
这段代码的循环体是空语句(末尾的分号),每一轮执行逻辑:
- 初始化
i=0 - 判断
0 < 5为true,执行空循环体(无任何操作) - 执行更新表达式:先
i++(i变为1),再执行System.out.print(i),输出1 - 判断
1 < 5为true,空循环体 - 更新:i++到2,输出2
- 以此类推,直到
i=4时:- 判断
4 <5为true,空循环体 - 更新:i++到5,输出5
- 判断
- 最后判断
5 <5为false,循环结束
拆解第二段代码的执行过程
这段代码把打印操作放到了更新表达式位置,循环体是i++,每一轮执行逻辑:
- 初始化
i=0 - 判断
0 <5为true,执行循环体i++(i变为1) - 执行更新表达式
System.out.print(i),输出1 - 判断
1 <5为true,循环体i++到2,更新输出2 - 以此类推,直到
i=4时:- 判断
4 <5为true,循环体i++到5,更新输出5
- 判断
- 判断
5 <5为false,循环结束
修正方案(得到期望的01234)
把打印操作放到循环体中,让每次判断通过后先打印初始值,再执行自增:
for(int i = 0;i <5; i++){ System.out.print(i); }
内容的提问来源于stack exchange,提问作者Gar1s
相关产品推荐
相关产品推荐

