1 public class Demo_01 { 2 public static void main(String[] args) { 3 int a = 10; 4 int b = 20; 5 int i = 0; 6 i = i++; 7 b = a++; 8 System.out.println(a); 9 System.out.println(b); 10 System.out.println(i); 11 } 12 }
先算等号,那,ok,答案就是a=11,b=10,i 呢???
这时候,我的第一反应i=0?然后i++?那i等于1?
其实正确答案是i=0。
用比较通俗的话来解释出现这个结果的原因,我们先来解释一下b=a++
Java代码这个语句的时候,我们从表面上看是先执行等于,在执行加加操作,但是实际在运行的时候,却不是这样的。为了让我们看起来是等于号先进行了操作,在实际的运行中,会先把a的值放在一个地方,然后让a进行++的操作,这时候得到结果11,然后把11赋值给a,把之前存好的10赋值给b,也就得到了我们想要的结果。
那如果进行的是i=i+1的操作呢,同理,i现在等于0,先把0找个地方藏好,执行i++,把结果1赋值给i,然后把0找出来在赋给i,所以i的值被0覆盖掉了,也就得到了0的结果。
上面是很通俗的解释,那稍微专业一点的解释就是(只解释一下i=i++),首先,因为这时候的i值为0,所以0先进栈,然后执行0+1的操作,下一步,得到的这个结果1进栈,到这里,进栈的操作结束,然后开始给i赋值,首先1出栈,这时候i=1,紧接着0出栈,i=0,完成了i的值得覆盖。
最后总结一下的话就是b=a++这样的语句在内部执行的过程和我们考虑优先级进行的计算的步骤是不一样的,所以导致了对于i=i++结果的错误计算。