五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C語言 & Java 解析:當 i = i++ 后,結(jié)果究竟是什么?

2021-08-09 18:40 作者:C語言編程__Plus  | 我要投稿

前言:

之前有朋友跟我討論過一個問題,他問在java中,i=1;i=i++;之后的結(jié)果時什么,我一開始認為是2,但當他說答案是1的時候,我不得不想一個合理的解釋,我想,可能是因為臨時變量,當i賦值給i后,自增更改了臨時變量,所以i值并沒有改變。當我在為我的解釋表示滿意時,他們說在c語言下的答案是2,好吧,我只能說是編譯器的實現(xiàn)不同,當然這個答案太沒說服力了,所以尋找答案的任務(wù)就開始了。


我先在《c++ primer》上看見這樣的解釋:“++i的效率要比i++的效率高,因為i++必須要有一個臨時變量來存放i本身的值“,那么我之前只說對了臨時變量,但原因是臨時變量先用來存放i的值,然后i本身自增,之后,臨時變量賦值給左邊,這時,i的值又被 自己之前的值覆蓋了,所以又變成1,但這只是個推測,再說c語言中為什么是2?所以不得不反編譯了。。。

java的jdk自帶一個工具,javap,可以反編譯,我們用它java編譯器生成的“jvm版匯編碼”,我會寫下兩段代碼用來做對比,一種是i=i++;一種常見的j=i++;注意,我使用2作為初始值(也就是說它會被自增為3),因為1太特殊了,它在字節(jié)碼中的變量名隨處可見,而且++不是加1么,所以我用2做初值,也方便查找。


javap -c Test?的字節(jié)碼如下:


就是定義并初始化i的值。

關(guān)鍵是這里:


其實在2: iload_1 時,i變量的值被放在了棧中,這就是我們說的臨時存儲。。之后,又被賦了過來

看看Test2,你就會明白正常的運作:


javap -c Test2?的字節(jié)碼如下:


現(xiàn)在明白了吧,,到底發(fā)生了什么。。

但是還沒完,,,,,我們還沒解釋在c語言中發(fā)生了什么。。。

在gcc中,編譯一個c程序要四個階段,預(yù)處理,編譯,匯編,鏈接。我們在編譯階段后停下,這樣會得到AT&T的匯編碼,

我們寫下兩種代碼,類似于java版

先看正常情況:


包括?movl $.LC0, %eax?和之后語句的都和輸出有關(guān)了。

我們再把初始化有關(guān)的除去,關(guān)鍵的部分是:


保存了i的值,(放在eax中),之后又放入j中,i再自增,這就很符合大家心里的答案,那么如果是i=i++時自然就是i被賦值,再自增。。。也就是大家心中的答案了,但是真是這樣么?我們繼續(xù)看。。。。


對應(yīng)的匯編碼:


關(guān)鍵部分就省一句了 addl $1, 28(%esp)這簡直就是。。。??次业膖est3.c吧。。。


產(chǎn)生的匯編碼:



恩,在c語言中i=i++;居然跟i++;的匯編代碼一樣,按正常的邏輯(我們之前的分析),i=2;i=i++;i的值是3,已經(jīng)沒問題了,但是gcc會對編譯器做一些優(yōu)化,所以保存i的值,在賦值給i,這兩條語句自然是雞肋了,就被優(yōu)化掉了。

總結(jié),我們發(fā)現(xiàn)對于i++保存的臨時值,java中是自增在返回臨時值,而c語言中是返回臨時值后,在自增,所以這就是為什么i=i++在這兩種語言中不同的結(jié)果了,c#我就不知道了,有興趣的同學(xué)可以試試,python么,沒有++啦,呵呵,如果我的分析有什么不對之初,希望能與你一起探討。

另外,對現(xiàn)在我們的大多數(shù)朋友來說還是學(xué)編程技術(shù)最重要!栽一棵樹最好的時間是十年前,其次是現(xiàn)在。對于準備學(xué)習編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!

微信公眾號:C語言編程學(xué)習基地

整理分享(多年學(xué)習的源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習編程的伙伴,利用更多的資料學(xué)習成長比自己琢磨更快哦!



C語言 & Java 解析:當 i = i++ 后,結(jié)果究竟是什么?的評論 (共 條)

分享到微博請遵守國家法律
根河市| 长顺县| 壶关县| 镇原县| 昭平县| 称多县| 宝丰县| 江口县| 桃江县| 宁陕县| 乌兰浩特市| 神池县| 兴海县| 图们市| 乌拉特前旗| 马公市| 汶川县| 汶上县| 桐庐县| 台东县| 宁明县| 孙吴县| 巴青县| 石屏县| 德安县| 屏东市| 鹤岗市| 岱山县| 温泉县| 建始县| 明星| 梁平县| 大庆市| 进贤县| 合阳县| 五常市| 突泉县| 聊城市| 会理县| 乐东| 台州市|