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

Advertisements

你可能會喜歡