请调试Java代码并解释x=x++执行逻辑及循环后x仍为3的原因
分析Java代码中的
x=x++行为及输出结果 首先先看完整的代码:
public static void main(String[] args) { int x=3; for(int i=0;i<3;i++) { if(i==1) { x=x++; } if(i%2==0&&x%2==0) { System.out.print("."); } if(i%2==0&&x%2==1) { System.out.print("-"); } if(i==2^x==4) { System.out.print(","); } } System.out.print("<"); }
先验证输出:--,<
我们逐轮分析循环的执行过程,跟踪变量x和每一步的输出:
第一轮循环(i=0)
- 初始
x=3,i=0不满足i==1,跳过x=x++ - 检查
i%2==0 && x%2==0:0%2=0,但3%2=1,条件不成立,不输出. - 检查
i%2==0 && x%2==1:两个条件都成立,输出- - 检查
i==2 ^ x==4:注意这里^是位异或运算符,不是逻辑异或。先计算i==2(结果为false)和x==4(结果为false),false ^ false结果是false,不输出, - 本轮输出:
-
第二轮循环(i=1)
- 满足
i==1,执行x=x++——这是核心问题,下面单独解释 i=1是奇数,i%2==0不成立,所以输出.和-的条件都不触发,无输出- 检查
i==2 ^ x==4:i==2是false,x==4是false,异或结果false,不输出, - 本轮输出:无
第三轮循环(i=2)
i==1不成立,跳过x=x++- 检查
i%2==0 && x%2==0:2%2=0,但x=3,3%2=1,条件不成立,不输出. - 检查
i%2==0 && x%2==1:两个条件都成立,输出- - 检查
i==2 ^ x==4:先算i==2(true)和x==4(false),true ^ false结果是true,输出, - 本轮输出:
-,
循环结束后执行System.out.print("<"),所以最终输出是- + `` + -, + < → --,<,和题目描述一致。
关键:x=x++的执行过程,为什么x还是3?
在Java中,后缀自增运算符++的规则是:先返回变量的当前值,再将变量自身加1。但当它出现在赋值表达式x = x++中时,执行步骤是这样的:
- 计算右侧表达式
x++:- 先读取
x的当前值(此时是3),作为这个表达式的返回结果 - 然后将
x的值自增1,此时x临时变成4
- 先读取
- 执行赋值操作:把右侧表达式的返回结果(也就是第一步读取的3)赋值给左侧的
x - 最终
x被重新覆盖为3,所以执行完x=x++后,x的值没有变化,还是3
简单来说,x++的自增效果被后续的赋值操作覆盖了,相当于做了“先加1,再把原来的值塞回去”的无用功。
总结
- 循环中
x=x++并没有改变x的值,因为后缀自增的返回值是原数值,赋值操作又把原数值写回了x - 逐轮跟踪变量和条件判断后,能清楚看到输出
--,<的由来
内容的提问来源于stack exchange,提问作者Abdallah Amir
相关产品推荐
相关产品推荐

