經(jīng)常在知乎上可以看到這個問題,于是嘗試著回答了一下,沒想到國內(nèi)C 巨佬吳詠煒老師還給我點了個贊,讓我相當激動,下面具體介紹下!
結(jié)論可能大家看上面的圖就知道了,沒有加return 0;編譯器會自動添加一個。那怎么證明呢?
可以查看相應(yīng)的匯編代碼,查看匯編代碼推薦使用godbolt.org網(wǎng)站,相當方便。
如上圖,輸入C 代碼,在右半部分會顯示編譯器編譯后的匯編代碼,通過查看高級語言背后的匯編指令我們可以更好的分析代碼的性能。網(wǎng)站更強大的功能是它支持市面上幾乎所有的編譯器,而且各個版本都有。
下面使用這個網(wǎng)站分析一波!
先看一段帶有return 0的截圖:
看我右面紅框圈出來的代碼,大家可以理解為eax就是main()函數(shù)的返回值,這里可以看到main()函數(shù)的返回值是0。
再看一段不帶return 0的相應(yīng)截圖:
可以發(fā)現(xiàn)編譯器還是把eax的值設(shè)為了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;但個人認為這也確實是不好的習(xí)慣,mian函數(shù)會犯這種錯誤,其它函數(shù)估計也會這樣,所以最好所有的帶有返回值的函數(shù)都添加return xxx。
打完收工。