無意中看到這樣一個問題:
int a = 1; a = a++;
此時 a = ?,我自己測試了一下,vs2008中得到a = 2 ;在linux中用gcc編譯得到的結果也是2,而當用java語言時,在JDK7環境下得到的結果a = 1;
為了搞清楚是怎麼回事,進行了一點研究,如下:
在vs2008中有這樣的匯編代碼:
a = a++; 00881445 8B 45 F8 mov eax,dword ptr [a] 00881448 89 45 F8 mov dword ptr [a],eax 0088144B 8B 4D F8 mov ecx,dword ptr [a] 0088144E 83 C1 01 add ecx,1 00881451 89 4D F8 mov dword ptr [a],ecx
很清楚明了吧! 即分解為:a = a; a++; 兩句,所以結果為a = 2; 很自然。接下來看看java語言中是怎麼處理的:
L0 LINENUMBER 4 L0 ICONST_1 ISTORE 1 L1 LINENUMBER 5 L1 ILOAD 1 IINC 1 1 ISTORE 1 L2
隨口說一下:java語言編譯後是運行在java虛擬機中的,java虛擬機值的傳遞都是基於棧的,沒有用寄存器。以上是它的字節碼助記符,可以清楚的看到它的
工作原理:可能有人看不懂,那我解釋一下:
L0與L1之間的代碼的意思是:ICONST_1:把常量1壓入棧,ISTORE 1:把棧頂的元素(也就是常量1)賦給變量a, L1與L2之間:ILOAD 1:把a的值壓入棧, IINC 1 1:
讓常量池中的a的值自加1,此時常量池中的a = 2, ISTORE 1:把棧頂元素(為1)彈出賦給常量池中的a, 所以a = 1。 也不知道java虛擬機怎麼會這樣處理,導致最終a的
值為1而不是2.