程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> java與c/c++會怎麼對待a = a++;

java與c/c++會怎麼對待a = a++;

編輯:C++入門知識

無意中看到這樣一個問題:

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.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved