普通的int main(){}沒(méi)有寫(xiě)return 0;會(huì)怎么樣?
可以查看相應(yīng)的匯編代碼,查看匯編代碼推薦使用godbolt.org網(wǎng)站,相當(dāng)方便。
如上圖,輸入C 代碼,在右半部分會(huì)顯示編譯器編譯后的匯編代碼,通過(guò)查看高級(jí)語(yǔ)言背后的匯編指令我們可以更好的分析代碼的性能。網(wǎng)站更強(qiáng)大的功能是它支持市面上幾乎所有的編譯器,而且各個(gè)版本都有。
下面使用這個(gè)網(wǎng)站分析一波!
先看一段帶有return 0的截圖:
看我右面紅框圈出來(lái)的代碼,大家可以理解為eax就是main()函數(shù)的返回值,這里可以看到main()函數(shù)的返回值是0。
再看一段不帶return 0的相應(yīng)截圖:
可以發(fā)現(xiàn)編譯器還是把eax的值設(shè)為了0,由此可以理解為,即使在main函數(shù)中不寫(xiě)return 0,編譯器還是會(huì)默認(rèn)添加個(gè)return 0。
那其他非main函數(shù)也會(huì)默認(rèn)添加個(gè)return 0嗎?
先看一個(gè)普通的帶有int返回值的函數(shù):
注意看func()中的eax寄存器被賦值為9,即func()的返回值為9。
如果不加return a是什么樣子?
可以看到,如果在func()內(nèi)不寫(xiě)return語(yǔ)句,編譯器則沒(méi)有給eax寄存器更新值,那函數(shù)的返回值就不會(huì)是我們期待的樣子。
得出結(jié)論:正常一個(gè)帶有返回值的函數(shù),返回值都會(huì)存在某個(gè)地方,可能是棧上也可能是寄存器里,如果你不給它返回值,那可能外部獲取的返回值就是個(gè)奇奇怪怪的值,因?yàn)樵垡膊恢滥菈K地址是什么數(shù)據(jù)。
但是吧,main函數(shù)除外,因?yàn)閙ain函數(shù)沒(méi)有return的話(huà),編譯器會(huì)默認(rèn)加個(gè)return 0;但個(gè)人認(rèn)為這也確實(shí)是不好的習(xí)慣,mian函數(shù)會(huì)犯這種錯(cuò)誤,其它函數(shù)估計(jì)也會(huì)這樣,所以最好所有的帶有返回值的函數(shù)都添加return xxx。打完收工。
C 學(xué)習(xí)資料免費(fèi)獲取方法:關(guān)注程序喵大人,后臺(tái)回復(fù)“程序喵”即可免費(fèi)獲取40萬(wàn)字C 進(jìn)階獨(dú)家學(xué)習(xí)資料。
往期推薦
1、少寫(xiě)點(diǎn)if-else吧,它的效率有多低你知道嗎?2、年度原創(chuàng)好文匯總3、全網(wǎng)首發(fā)??!C 20新特性全在這一張圖里了4、他來(lái)了,他來(lái)了,C 17新特性精華都在這了5、一文讓你搞懂設(shè)計(jì)模式6、C 11新特性,所有知識(shí)點(diǎn)都在這了!