您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“java中a=a+1和a+=1的區(qū)別是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
public static void test(Object obj) { System.out.println(obj.getClass()); }
(1) 精度小于int(或long)的數(shù)值運(yùn)算的時(shí)候都回被自動(dòng)轉(zhuǎn)換為int(或long)后進(jìn)行計(jì)算,運(yùn)算結(jié)果為
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)進(jìn)行計(jì)算,會(huì)自動(dòng)先提升float(double),在進(jìn)行計(jì)算
int i2 = 1; float j2 = 1.5f; test(i2 + j2);//class java.lang.Float
(3)float與double進(jìn)行運(yùn)算時(shí),會(huì)float會(huì)先提升為double
float i3 = 1.2f; double j3 = 1; test(i3 + j3);//class java.lang.Double
(4)a=a+1和a+=1的區(qū)別
如果問 a++ 和 ++a 的區(qū)別,估計(jì)很多都能回答上來。a++ 是先取 a 的值再自增 。而 ++a 剛好相反,是先自增再取 a 的值。這里有點(diǎn)編程基礎(chǔ)都可以理解,不做過多解釋,但在 Java 里面事情就真的這么簡單嗎?
int a = 1; a = a++; System.out.println(a);
憑借自己所學(xué),在不測試的情況下,你能給出答案嗎?
第一次看見這個(gè)問題的時(shí)候,想當(dāng)然的認(rèn)為答案是:2。但殘酷的事實(shí)告訴我,答案是:1。當(dāng)時(shí)面對(duì)這個(gè)結(jié)果我是無法接受的,網(wǎng)上瘋狂搜索這個(gè)答案的解釋。限于當(dāng)時(shí)知識(shí)的水平,只記住了這個(gè)結(jié)論,至于推導(dǎo)這個(gè)結(jié)論那些指令,一個(gè)也不能理解。今天看書遇見數(shù)據(jù)操作,就又想起了這個(gè)問題,就根據(jù)自己的知識(shí)水平,重新推導(dǎo)這個(gè)過程。
首先用 IDEA 打開生成的 class 文件。
很直觀的告訴我們結(jié)果為 1 ,但這段代碼只解釋了 result,而沒有解釋 why ,繼續(xù)用 javap -c 這個(gè)命令,結(jié)果如圖。
以第一次遇見這道題的水準(zhǔn),勉強(qiáng)能看懂第一步的 Java 代碼,第二步的指令就徹底看不懂了。而現(xiàn)在我可以從這些指令里面分析結(jié)果了(這里需要分析的就前五行命令,后面指令為打印輸出)。
iconst_1
將常量 1 壓入操作數(shù)棧。這個(gè)操作是 int 值為 1~5 的時(shí)候。如果是 -128~127 這個(gè)范圍是用的 bipush x (x 為實(shí)際數(shù)值)。 -2^15~2^15-1 這個(gè)范圍是使用的 sipush x 這個(gè)命令(同上)。 -2^31~2^31-1 這個(gè)范圍是使用的 ldc 這個(gè)命令。
istore_1
彈出操作數(shù)棧頂?shù)臄?shù)(此時(shí)為 1)并賦值給局部變量第一個(gè)元素即索引為 1 的 a。局部變量是采用的數(shù)組形式,索引為 0 的是 main()
的參數(shù) args 。
iload_1
把局部變量索引為 1 的變量(這里是 a)壓入操作數(shù)棧,此時(shí)棧頂元素為 1 。
incc 1,1(關(guān)鍵)
把局部變量索引為 1 的數(shù)加 1 ,此時(shí) a 的值為 2。注意:這個(gè)結(jié)果沒有壓入操作數(shù)棧。
istore_1
彈出棧頂?shù)脑兀ù藭r(shí)為 1)賦值給 a ,覆蓋 a 為 2 的結(jié)果。
整個(gè)過程大致就是這樣,來一幅圖解釋吧。
這個(gè)問題解決了,那么下面這段代碼就好理解了。
int a = 1; a = ++a; System.out.println(a);
直接上截圖吧
“java中a=a+1和a+=1的區(qū)別是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。