普通的int main(){}沒有寫return 0;會怎麼樣?

語言: CN / TW / HK

經常在知乎上可以看到這個問題,於是嘗試著回答了一下,沒想到國內C++巨佬吳詠煒老師還給我點了個贊,讓我相當激動,下面具體介紹下!

結論可能大家看上面的圖就知道了,沒有加return 0;編譯器會自動新增一個。那怎麼證明呢?


可以檢視相應的彙編程式碼,檢視彙編程式碼推薦使用godbolt.org網站,相當方便。



如上圖,輸入C++程式碼,在右半部分會顯示編譯器編譯後的彙編程式碼,通過檢視高階語言背後的彙編指令我們可以更好的分析程式碼的效能。網站更強大的功能是它支援市面上幾乎所有的編譯器,而且各個版本都有。


下面使用這個網站分析一波!


先看一段帶有return 0的截圖:



看我右面紅框圈出來的程式碼,大家可以理解為eax就是main()函式的返回值,這裡可以看到main()函式的返回值是0。


再看一段不帶return 0的相應截圖:


可以發現編譯器還是把eax的值設為了0,由此可以理解為,即使在main函式中不寫return 0,編譯器還是會預設添加個return 0。


那其他非main函式也會預設添加個return 0嗎?


先看一個普通的帶有int返回值的函式:


注意看func()中的eax暫存器被賦值為9,即func()的返回值為9。


如果不加return a是什麼樣子?



可以看到,如果在func()內不寫return語句,編譯器則沒有給eax暫存器更新值,那函式的返回值就不會是我們期待的樣子。


得出結論:正常一個帶有返回值的函式,返回值都會存在某個地方,可能是棧上也可能是暫存器裡,如果你不給它返回值,那可能外部獲取的返回值就是個奇奇怪怪的值,因為咱也不知道那塊地址是什麼資料。


但是吧,main函式除外,因為main函式沒有return的話,編譯器會預設加個return 0;但個人認為這也確實是不好的習慣,mian函式會犯這種錯誤,其它函式估計也會這樣,所以最好所有的帶有返回值的函式都新增return xxx。

打完收工。


C++學習資料免費獲取方法:關注程式喵大人,後臺回覆“程式喵”即可免費獲取40萬字C++進階獨家學習資料。





往期推薦


1、少寫點
if-else吧,它的效率有多低你知道嗎?
2、年度原創好文彙總
3、全網首發!!C++20新特性全在這一張圖裡了
4
他來了,他來了,C+
+17新特性精華都在這了
5 、一文讓你搞懂設計模式
6、C++11新特性,所有知識點都在這了!



本文分享自微信公眾號 - 嵌入式技術筆記(fensnote)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。