过程 让我 总结 完成 开始 java 代码 进栈 优先级
- public class Demo_01 {
- public static void main(String[] args) {
- int a = 10;
- int b = 20;
- int i = 0;
- i = i++;
- b = a++;
- System.out.println(a);
- System.out.println(b);
- System.out.println(i);
- }
- }
先算等号,那,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++ 结果的错误计算。
Java 中的 i=i++
来源: http://www.bubuko.com/infodetail-2270195.html