java中關於a++跟++a的操做運算解釋

昨天,在羣裏被一我的問了一段代碼,代碼以下:java

int a = 1;
		int b;
		b = a+(++a)+(++a);
		System.out.println(b);

你們猜猜打印結果是多少,我開始猜的打印結果是9,貼上代碼後,才發現,打印結果是6,而後我就很納悶,怎麼是6?查看了一下class文件,而後問了下"腿毛",而後就知道了.下面進入正文吧測試

 

----------------------------------分割線---------------------------------------spa

咱們都知道,a++跟++a分別是不一樣的操做,前者是先運算,後自增,後者是先自增,後運算,若是遇到了以下代碼:a+(++a)+(++a),運算過程是怎麼樣呢,先讓咱們看最簡單的.net

 

PS:首先,引入腿毛知乎的一小段代碼(版權費已經給腿毛了,,雖然只有1.11),我就不寫了,太麻煩,有興趣的同窗能夠本身經過 javap -c XX.class 查看運行指令

 

先看下面這段代碼(下面全部指令都是經過查看class文件後獲得的,有興趣的同窗,能夠本身查看)code

int a = 789;
int b;
b = a++;

 

  1. sipush 789 // 把一個789放入棧頂
  2. istore_1 // 把這個789存給a
  3. iload_1 // 把a放到棧頂,棧頂就是789了
  4. iinc 1, 1 // 把a加一,a就是790了
  5. istore_2 // 把棧頂的數存給b,b變成了789

而後,咱們改下上面的代碼blog

int a = 789;
int b;
b = ++a;
  1. sipush 789 // 把一個789放入棧頂
  2. istore_1 // 把這個789存給a
  3. iinc 1, 1 // 把a加一,a就是790了
  4. iload_1 // 把a放到棧頂,棧頂就是790了
  5. istore_2 // 把棧頂的數存給b,b變成了790

     也就中間兩條指令順序變了,其餘的沒有區別ip

 

好了,下面是重頭戲了,貼上文章開頭的代碼(用紅色表示這是我本身的代碼...)內存

int a = 1;
		int b;
		b = a+(++a)+(++a);
		System.out.println(a); //輸出結果是3
		System.out.println(b); //輸出結果是6

 

  1. iconst_1          // 數值1放入棧頂
  2. istore_1          // 把1存給a
  3. iload_1           // 把a放到棧頂,棧頂有1了
  4. iinc          1, 1 //把a加一,a就是2了
  5. iload_1          //把a放到棧頂,棧頂有2了
  6. iadd             //棧頂兩int型數值相加,棧頂就是3了
  7. iinc        1, 1 //把a加一,a就是3了
  8. iload_1        //把a放到棧頂,棧頂就是3了
  9. iadd           //棧頂兩int型數值相加,棧頂就是6了
  10. istore_2     //把6給b,完成運算

 

----------------------------------分割線---------------------------------------get

下面是總結,可能我的理解,會有點偏差,同窗能夠本身根據指令來理解

PS:a+(++a)+(++a) 運算過程白話版:

1. a初始化1,入棧頂
2.(++a)運算,a=2,參與內存運算
3.(++a)運算 a=3,參與內存運算
4. 計算:1+2+3
得到結果,而且賦值

 

也就是,參與運算的,並非a自己,而是a的值...經過指令的調用,a的值每次到棧頂都不同,a第一次入棧頂的時候是1,第二次入棧頂++a,就是2了,並且a的值會變爲2,第三次入棧頂++a,就是3了,並且a的值會變爲3,棧頂數值相加就是 1+2+3,可能有人會問,若是這樣,應該是3個a相加,可是實際不是的,參與運算的是a的值,不是a自己,每次入棧頂,a的值都會變化,因此就會形成理解的偏差,最後在說一句:java運算參與,是變量值的運算,而不是變量自己博客

 

 

以上..在加一個,若是要查看指令,能夠到下面這博客查看:http://blog.csdn.net/lm2302293/article/details/6713147

 

完結,寫完,收工!

 

插入我的廣告:Python交流羣,掃描二維碼進入

吾愛java交流羣號:170936712(裏面有基佬,有萌萌,有大牛...)

歡迎你們入坑!!

 

以上,均爲本人測試而得出的結果,可能會有出入,或者錯誤,歡迎指正

歡迎轉載,請註明出處跟做者,謝謝!

相關文章
相關標籤/搜索