第二种结果其实很明显不用解释,我结合字节码给你解释一下第一种情况,下面是,a=10;a=a++;编译后的字节码:
其中的几个指令用图解释一下(图片是网上找的):
从操作数栈中弹出一个int型的操作数(即常量0),然后将其放置在局部变量1号位置(0号位置已被this占据)
所以可以解释上面的字节码了:
第0,1行合起来就代表将10赋给第二个方法局部变量a;
第3行代表取得a(方法第二个局部变量)的值(此时为10),放入操作数栈;
第4行代表(第二个局部变量)a自增,由10变为11;
第5行代表从操作数栈中弹出一个数(即第3行弹入的10),放到(第二个局部变量)a
所以从代码角度来解释a的最终结果就是10。
上面结合字节码来解释是为了更有说服力,但是比较难理解。但是光从源代码来理解也很好理解,关键在于弄清楚=和++两个操作符的优先级。
在执行a=a++;的时候,首先要计算等号右边的值,用来最后赋给a,由于++是后增,所以取得的值是10。
接着就是执行++操作,因为++的优先级比=高,执行完这步之后其实a的值变为了11,
但是关键在于最后=操作符的执行,他将刚开始计算出来的右边的值10右赋给了a,所以a现在又变成了10。
最后的最后,操作符的优先级很重要,如果=的优先级比++高,那么上面的结果将是先赋值,再自增,a的结果将是11.
希望我的解释对楼主有帮助,谢谢!
|