文章目錄??作者主頁:微涼秋意
?作者簡介:后端領(lǐng)域優(yōu)質(zhì)創(chuàng)作者🏆,內(nèi)容合伙人🏆,阿里云專家博主🏆
?精品專欄:C++面向?qū)ο?/p>成都創(chuàng)新互聯(lián)作為成都網(wǎng)站建設(shè)公司,專注網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問題,行業(yè)涉及活動板房等多個(gè)領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。
最近身邊的朋友分享了一些有趣的算法題給我,我看到題后直接不假思索的說出了我的答案,然而沒有一道說對的,頓時(shí)我的脾氣就上來了,通過查閱資料并與同學(xué)討論,最終從語言特點(diǎn)以及匯編層面解決了問題。接下來我把三道題目放出來,大家盡情作答,看看你是否能成功入坑。
第一題:你覺得i
的結(jié)果為多少?A. 99 B. 100 C. 0
第二題:C/C++以及Java 輸出的結(jié)果會不會相同呢?A. 相同 B. 不相同
1、第一題揭秘
正確答案應(yīng)該是 0:
i = 0;
i = i++;
如上,i++
即0++
,把結(jié)果0
賦給i
,然后再進(jìn)行加1
操作,for
循環(huán)了100次,那么最終i
也遞增了100次,答案為什么不是100??
實(shí)際上,i
確實(shí)遞增了,但是屬于 “無效遞增”。
不妨從JVM
內(nèi)存模型上分析,賦值運(yùn)算符兩邊會分別進(jìn)入內(nèi)存中的兩個(gè)部分,前者是局部變量表,后者是操作數(shù)棧,對于i = 0來說,0會先進(jìn)入操作數(shù)棧,i 進(jìn)入局部變量表中,操作數(shù)棧彈出棧頂元素賦值給局部變量,也就是把 0 賦值給了 i;那么對于i = i++,i++ 首先入操作數(shù)棧,也就是操作數(shù)棧的棧頂是0++ ,局部變量表中的 i 會進(jìn)行自增變?yōu)?1,最終操作數(shù)棧彈出棧頂,將 0 賦值給局部變量表中的 i。這樣無論進(jìn)行多少次賦值操作,最終 i 的結(jié)果只能是 0。
而對于 i = ++i,操作數(shù)棧中進(jìn)入的是 ++i,也就是操作數(shù)棧的棧頂元素等于1,局部變量表中的 i 自增后結(jié)果也是1,最后彈出棧賦值結(jié)果也會是1,因此對于 ++i 操作直接按照字面意思理解即可。
2、第二題揭秘先來看一下打印結(jié)果吧:
Java 運(yùn)行結(jié)果:
C/C++ 運(yùn)行結(jié)果:
可以清晰地看到 Java 的打印結(jié)果與 C/C++ 不同,在下面將做出我的解釋。
2.1、Java 中的printf 是格式化輸出諸如%d
、%f
、%s
分別代表著整型、浮點(diǎn)型、字符串類型的占位符,在進(jìn)行打印的時(shí)候會被后續(xù)的變量替代。在a
為 2 時(shí),a++
的結(jié)果為 2 ,自增后 a 變?yōu)?3,然后進(jìn)行++a
,結(jié)果為 4,而 Java 的打印結(jié)果也確實(shí)如此。
按照同樣的理解,為什么 C/C++ 中的結(jié)果是 3 4 呢?這就涉及到了 函數(shù)調(diào)用約定 問題,printf
和cout
參數(shù)是右向左進(jìn)行入棧操作的。那到底這個(gè)入棧操作是怎么進(jìn)行的呢,那就往下看看匯編的指令吧!
匯編層面解析printf
函數(shù)執(zhí)行順序:
由上面匯編指令得知執(zhí)行流程為:
++a
:a++
:temp
結(jié)果分析:
a++
的結(jié)果就是臨時(shí)存儲單元temp
對應(yīng)的結(jié)果,而此結(jié)果正是 3,++a
的結(jié)果就是累加器 eax 存儲的值,該值經(jīng)過兩次 add 1 操作,從 2 變?yōu)榱?4,最終結(jié)果也就是 4。這也正是C 語言printf
輸出的結(jié)果。
對于C++中的cout
執(zhí)行流程我便不做解釋,過程與printf
一致,都是右向左先進(jìn)行入棧操作,看了這么多,來一個(gè)練習(xí)題吧:
最終打印結(jié)果為?我做個(gè)投票吧,一天后我在評論區(qū)公布答案,大家快來檢驗(yàn)一波學(xué)習(xí)成果!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
新聞名稱:i=i++計(jì)算過程還不會?C/C++的輸出語句與Java有何不同?-創(chuàng)新互聯(lián)
本文鏈接:http://chinadenli.net/article26/egijg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、定制網(wǎng)站、商城網(wǎng)站、App設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容