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