java中a=a+1和a+=1的區(qū)別介紹
java a=a+1和a+=1的區(qū)別
測試用例調用的方法
public static void test(Object obj) { System.out.println(obj.getClass()); }
(1) 精度小于int(或long)的數(shù)值運算的時候都回被自動轉換為int(或long)后進行計算,運算結果為
char i = 'a'; byte j = 2; test(i + j);//class java.lang.Integer byte i1 = 1; short j1 = 2; test(i1 + j1);//class java.lang.Integer
(2)char、byte、short、int、long等整形數(shù)和float(或double)進行計算,會自動先提升float(double),在進行計算
int i2 = 1; float j2 = 1.5f; test(i2 + j2);//class java.lang.Float
(3)float與double進行運算時,會float會先提升為double
float i3 = 1.2f; double j3 = 1; test(i3 + j3);//class java.lang.Double
(4)a=a+1和a+=1的區(qū)別
Java趣事a=a++和a=++a
如果問 a++ 和 ++a 的區(qū)別,估計很多都能回答上來。a++ 是先取 a 的值再自增 。而 ++a 剛好相反,是先自增再取 a 的值。這里有點編程基礎都可以理解,不做過多解釋,但在 Java 里面事情就真的這么簡單嗎?
int a = 1; a = a++; System.out.println(a);
憑借自己所學,在不測試的情況下,你能給出答案嗎?
第一次看見這個問題的時候,想當然的認為答案是:2。但殘酷的事實告訴我,答案是:1。當時面對這個結果我是無法接受的,網上瘋狂搜索這個答案的解釋。限于當時知識的水平,只記住了這個結論,至于推導這個結論那些指令,一個也不能理解。今天看書遇見數(shù)據(jù)操作,就又想起了這個問題,就根據(jù)自己的知識水平,重新推導這個過程。
首先用 IDEA 打開生成的 class 文件。
很直觀的告訴我們結果為 1 ,但這段代碼只解釋了 result,而沒有解釋 why ,繼續(xù)用 javap -c 這個命令,結果如圖。
以第一次遇見這道題的水準,勉強能看懂第一步的 Java 代碼,第二步的指令就徹底看不懂了。而現(xiàn)在我可以從這些指令里面分析結果了(這里需要分析的就前五行命令,后面指令為打印輸出)。
iconst_1
將常量 1 壓入操作數(shù)棧。這個操作是 int 值為 1~5 的時候。如果是 -128~127 這個范圍是用的 bipush x (x 為實際數(shù)值)。 -2^15~2^15-1 這個范圍是使用的 sipush x 這個命令(同上)。 -2^31~2^31-1 這個范圍是使用的 ldc 這個命令。
istore_1
彈出操作數(shù)棧頂?shù)臄?shù)(此時為 1)并賦值給局部變量第一個元素即索引為 1 的 a。局部變量是采用的數(shù)組形式,索引為 0 的是 main() 的參數(shù) args 。
iload_1
把局部變量索引為 1 的變量(這里是 a)壓入操作數(shù)棧,此時棧頂元素為 1 。
incc 1,1(關鍵)
把局部變量索引為 1 的數(shù)加 1 ,此時 a 的值為 2。注意:這個結果沒有壓入操作數(shù)棧。
istore_1
彈出棧頂?shù)脑兀ù藭r為 1)賦值給 a ,覆蓋 a 為 2 的結果。
整個過程大致就是這樣,來一幅圖解釋吧
這個問題解決了,那么下面這段代碼就好理解了。
int a = 1; a = ++a; System.out.println(a);
直接上截圖吧
仔細對比一下,你會發(fā)現(xiàn),兩段代碼的指令一模一樣,但執(zhí)行順序有一點點區(qū)別, iinc 和 iload_1 這兩個命令的執(zhí)行順序變化了一下位置。你還記得這兩條指令的含義嗎?你還記得文章最開始說的區(qū)別嗎?
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Springboot實現(xiàn)阿里云通信短信服務有關短信驗證碼的發(fā)送功能
短信驗證碼是通過發(fā)送驗證碼到手機的一種有效的驗證碼系統(tǒng)。主要用于驗證用戶手機的合法性及敏感操作的身份驗證。下面通過本文大家分享Springboot實現(xiàn)阿里云通信短信服務有關短信驗證碼的發(fā)送功能,一起看看吧2017-08-08關于Java中try finally return語句的執(zhí)行順序淺析
這篇文章主要介紹了關于Java中try finally return語句的執(zhí)行順序淺析,需要的朋友可以參考下2017-08-08SpringCloud服務注冊和發(fā)現(xiàn)組件Eureka
對于微服務的治理而言,其核心就是服務的注冊和發(fā)現(xiàn)。在SpringCloud 中提供了多種服務注冊與發(fā)現(xiàn)組件,官方推薦使用Eureka。本篇文章,我們來講解springcloud的服務注冊和發(fā)現(xiàn)組件,感興趣的可以了解一下2021-05-05Java深入了解數(shù)據(jù)結構之二叉搜索樹增 插 刪 創(chuàng)詳解
二叉搜索樹是以一棵二叉樹來組織的。每個節(jié)點是一個對象,包含的屬性有l(wèi)eft,right,p和key,其中,left指向該節(jié)點的左孩子,right指向該節(jié)點的右孩子,p指向該節(jié)點的父節(jié)點,key是它的值2022-01-01SpringBoot使用Spring Security實現(xiàn)登錄注銷功能
這篇文章主要介紹了SpringBoot使用Spring Security實現(xiàn)登錄注銷功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-09-09