昨天,在羣裏被一我的問了一段代碼,代碼以下: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
先看下面這段代碼(下面全部指令都是經過查看class文件後獲得的,有興趣的同窗,能夠本身查看)code
int a = 789; int b; b = a++;
- sipush 789 // 把一個789放入棧頂
- istore_1 // 把這個789存給a
- iload_1 // 把a放到棧頂,棧頂就是789了
- iinc 1, 1 // 把a加一,a就是790了
- istore_2 // 把棧頂的數存給b,b變成了789
而後,咱們改下上面的代碼blog
int a = 789; int b; b = ++a;
- sipush 789 // 把一個789放入棧頂
- istore_1 // 把這個789存給a
- iinc 1, 1 // 把a加一,a就是790了
- iload_1 // 把a放到棧頂,棧頂就是790了
- 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
- iconst_1 // 數值1放入棧頂
- istore_1 // 把1存給a
- iload_1 // 把a放到棧頂,棧頂有1了
- iinc 1, 1 //把a加一,a就是2了
- iload_1 //把a放到棧頂,棧頂有2了
- iadd //棧頂兩int型數值相加,棧頂就是3了
- iinc 1, 1 //把a加一,a就是3了
- iload_1 //把a放到棧頂,棧頂就是3了
- iadd //棧頂兩int型數值相加,棧頂就是6了
- 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(裏面有基佬,有萌萌,有大牛...)
歡迎你們入坑!!
以上,均爲本人測試而得出的結果,可能會有出入,或者錯誤,歡迎指正
歡迎轉載,請註明出處跟做者,謝謝!