欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

i=i++計(jì)算過程還不會?C/C++的輸出語句與Java有何不同?-創(chuàng)新互聯(lián)

??作者主頁:微涼秋意
?作者簡介:后端領(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)可。

文章目錄
  • 🔥前言
  • 1、第一題揭秘
    • 1.1、認(rèn)為是100 的原因
    • 1.2、0 的正確打開方式
  • 2、第二題揭秘
    • 2.1、Java 中的printf 是格式化輸出
    • 2.2、C/C++ 打印時(shí)按照從右向左順序入棧
  • 3、 留一道課后作業(yè)


🔥前言

最近身邊的朋友分享了一些有趣的算法題給我,我看到題后直接不假思索的說出了我的答案,然而沒有一道說對的,頓時(shí)我的脾氣就上來了,通過查閱資料并與同學(xué)討論,最終從語言特點(diǎn)以及匯編層面解決了問題。接下來我把三道題目放出來,大家盡情作答,看看你是否能成功入坑。

第一題:你覺得i的結(jié)果為多少?A. 99 B. 100 C. 0

第一題

第二題:C/C++以及Java 輸出的結(jié)果會不會相同呢?A. 相同 B. 不相同

第二題在這里插入圖片描述

1、第一題揭秘

正確答案應(yīng)該是 0:

在這里插入圖片描述

1.1、認(rèn)為是100 的原因
i = 0;
i = i++;

如上,i++0++,把結(jié)果0賦給i,然后再進(jìn)行加1操作,for循環(huán)了100次,那么最終i也遞增了100次,答案為什么不是100??

實(shí)際上,i確實(shí)遞增了,但是屬于 “無效遞增”。

1.2、0 的正確打開方式

不妨從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)用約定 問題,printfcout參數(shù)是右向左進(jìn)行入棧操作的。那到底這個(gè)入棧操作是怎么進(jìn)行的呢,那就往下看看匯編的指令吧!

2.2、C/C++ 打印時(shí)按照從右向左順序入棧

匯編層面解析printf函數(shù)執(zhí)行順序:

匯編

由上面匯編指令得知執(zhí)行流程為:

  1. 先處理最后一個(gè)參數(shù)++a
    • 通過 mov 傳送指令將 內(nèi)存中a對應(yīng)的值傳送到累加器 eax 中
    • 累加器進(jìn)行加 1 操作后將此值再次送回內(nèi)存
  2. 然后處理參數(shù)a++
    • 先將此時(shí) a對應(yīng)的值傳送到寄存器 ecx 中,然后存儲到另一個(gè)內(nèi)存單元中,為了方便描述,將該內(nèi)存單元稱為temp
      • mov 指令不允許兩邊的操作數(shù)同時(shí)為內(nèi)存,因此使用 ecx 作為媒介
    • 隨后將 a 對應(yīng)的值送到寄存器 edx 中并進(jìn)行加 1 操作并重新送入原內(nèi)存中
  3. 運(yùn)算完后,將 a 對應(yīng)的值傳送到 eax 中通過 push 指令入棧,將 temp 內(nèi)存對應(yīng)的值送到 ecx 中也通過 push 入棧,最后將剩余字符串入棧,調(diào)用函數(shù),完成打印。

結(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é)果。

3、 留一道課后作業(yè)

對于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)

商城網(wǎng)站建設(shè)