面試官:i = i++和 i = ++i 的有什么區(qū)別?
點(diǎn)擊“開發(fā)者技術(shù)前線”,選擇“星標(biāo)?”
在看|星標(biāo)|留言,? 真愛(ài)

出處:blog.csdn.net/qq_44377709/article/details/106643703
寫在前面:前些天看完了JVM的內(nèi)存結(jié)構(gòu),自以為自己是懂了,心里想想不就是分線程共享和線程私有嘛,然后又怎么怎么分怎么怎么的嘛…
直到遇到了這道題目。說(shuō)句實(shí)話,曾經(jīng)自己做這種運(yùn)算題目,完全是靠腦子空想,然后拿上筆顫抖的寫下一個(gè)自己都不知道正不正確的答案。不過(guò)過(guò)了今天,我終于能確定它的答案了。
為此,我也專門寫一篇博客,記錄我的學(xué)習(xí)?。?!
1、題目
package?pers.mobian.questions01;
public?class?test01?{
????public?static?void?main(String[]?args)?{
????????int?i?=?1;
????????i?=?i++;
????????int?j?=?i++;
????????int?k?=?i?+?++i?*?i++;
????????System.out.println("i="+i);
????????System.out.println("j="+j);
????????System.out.println("k="+k);
????}
}
你能肯定并且準(zhǔn)確的說(shuō)出你的答案嗎?
2、分析
在做這道題時(shí)我們的腦中要有對(duì)應(yīng)的JVM內(nèi)存結(jié)構(gòu)。其中一個(gè)方法對(duì)應(yīng)一個(gè)棧幀

此題目我們只需要用到棧幀里面的局部變量表和操作數(shù)棧
2.1、第一步
int i = 1

只是一個(gè)簡(jiǎn)單的賦值操作
2.2、第二步
i = i++

結(jié)果:i還是等于1
2.3、第三步
int j = i++

結(jié)果:i在局部變量表中變成了2,操作數(shù)棧中的 i 值為1,并且將 i 的值返回給 j,即此條語(yǔ)句以后,i = 2,j = 1
2.4、第四步
int k = i + ++i * i++

結(jié)果:局部變量表中的i = 4,k = 11
2.5、結(jié)果

3、i = ++i
按理說(shuō)根據(jù)上面的分析過(guò)程,再來(lái)分析?i = ++i,就很簡(jiǎn)單了。
我們的 i 變量先在局部變量表中進(jìn)行自增,然后再將 i 進(jìn)棧,然后再把棧中的數(shù)據(jù)返回給我們的變量 i 。
public?class?test02?{
????public?static?void?main(String[]?args)?{
????????int?i?=?1;
????????i?=?++i;
????????System.out.println(i);?//?結(jié)果:i = 2
????}
}
END
END
前線推出學(xué)習(xí)交流群,加群一定要備注:研究/工作方向+地點(diǎn)+學(xué)校/公司+昵稱(如大數(shù)據(jù)+上海+上交+可可),根據(jù)格式備注,可更快被通過(guò)且邀請(qǐng)進(jìn)群,領(lǐng)取一份專屬學(xué)習(xí)禮包
掃碼加我微信進(jìn)群,內(nèi)推和技術(shù)交流,大佬們零距離
歷史推薦
面試官:如何決定使用 HashMap 還是 TreeMap?
為什么老外不愿意用 MyBatis?
上億數(shù)據(jù)如何做到毫秒級(jí)查詢?
字節(jié)一面,面試官拿 System.out.println() 考了我半個(gè)小時(shí)?
為什么阿里巴巴要禁用 Executors 創(chuàng)建線程池?
歷史推薦
面試官:如何決定使用 HashMap 還是 TreeMap? 為什么老外不愿意用 MyBatis? 上億數(shù)據(jù)如何做到毫秒級(jí)查詢? 字節(jié)一面,面試官拿 System.out.println() 考了我半個(gè)小時(shí)? 為什么阿里巴巴要禁用 Executors 創(chuàng)建線程池?

