Java:int a=0;a=a++;問:a=?
感興趣的小夥伴可以去測試一下。
答案:a=0
我當時也是有點疑惑的:雖然是先執行計算然後再執行自加操作,但是a還是自加了啊!
代碼測試的結果就是a=0
我就在思考a=a++這句代碼,是將右邊表達式的值賦值給左邊的變數。那麼a++表達式的值其實是0,
然後賦值給了a,所以a=0。
我這麼想好像還解釋的通哈。
直到我看到了有大神通過Java位元組碼來分析其中的原由的時候,我才恍然大悟。
下面給出類似問題的位元組碼分析過程:
使用 javap -v Test >> test.txt 將Test類的位元組碼信息輸出到text.txt
1、int a=0;a=a++;
生成的位元組碼是:
0 iconst_0 -----0壓入棧頂
Advertisements
1 istore_1 [a] -----棧頂值(0)存入局部變數1(a)
2 iload_1 [a] -----變數1的值壓入棧頂(值為0)(a++效果)
3 iinc 1 1 [a] -----變數1自加(a++操作,自加后變數1的值為1)
6 istore_1 [a] -----將棧頂值(0)存入變數1(=操作)
a的值依次變化為:0->1->0
2、int a=0;a=++a;
生成的位元組碼是:
0 iconst_0 -----0壓入棧頂
1 istore_1 [a] -----棧頂值(0)存入局部變數1(a)
2 iinc 1 1 [a] -----變數1自加(++a操作,自加后變數1的值為1)
Advertisements
5 iload_1 [a] -----變數1的值壓入棧頂(值為1)(++a效果)
6 istore_1 [a] -----將棧頂值(1)存入變數1(=操作)
a的值依次變化為:0->1->1
3、int a=0;a=(a++)+(++a);
0 iconst_0 -----0壓入棧頂
1 istore_1 [a] -----棧頂值(0)存入局部變數1(a)
2 iload_1 [a] -----變數1的值壓入棧頂(值為0)(a++效果)
3 iinc 1 1 [a] -----變數1自加(a++操作,自加后變數1的值為1)
6 iinc 1 1 [a] -----變數1自加(++a操作,自加后變數1的值為2)
9 iload_1 [a] -----變數1的值壓入棧頂(值為2)(++a效果)
10 iadd -----棧頂兩值(0,2)相加(結果為2),並存入棧頂
11 istore_1 [a]-----將棧頂值(2)存入變數1(=操作)
a的值依次變化為:0->1->2->2