事實上 無論是return ; 還是return X;
10多年專注成都網(wǎng)站制作,企業(yè)網(wǎng)站建設,個人網(wǎng)站制作服務,為大家分享網(wǎng)站制作知識、方案,網(wǎng)站設計流程、步驟,成功服務上千家企業(yè)。為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及定制高端網(wǎng)站建設服務,專注于企業(yè)網(wǎng)站建設,高端網(wǎng)頁制作,對PE包裝袋等多個領域,擁有豐富的網(wǎng)站運維經(jīng)驗。
在匯編上都只有一條指令:ret(retn)
只不過對于return X; 會在 執(zhí)行ret指令之前對eax寄存器賦值:
如果是return 0 ; 可能編譯器會這樣做:
xor eax,eax
ret
其他情況類似
然后從C語言角度講
對于返回類型為void的函數(shù)
函數(shù)體內(nèi)可以出現(xiàn)return;語句來表示結束本函數(shù)的執(zhí)行
這個時候eax還是有值的,因為 函數(shù)返回類型是void,因此在調(diào)用該函數(shù)的地方不可能會去用該函數(shù)的返回值,也就意味著該返回值是毫無意義的
樓主想問的 單獨的return;語句,對于這行代碼,一般只用在返回類型為void的函數(shù)體內(nèi)
若出現(xiàn)在非void返回類型的函數(shù)體內(nèi),那么返回值是隱含在寄存器eax中的
然后對于有返回值的函數(shù)來說
return后面是肯定需要跟一個值的
這個值是被送入寄存器eax帶出來的~
我說再多 也許還是會有人不信(本人玩逆向的,這一切信不信那是你們的事,我只能把事實告訴你們,我也只能做到這樣了)
下面直接上代碼上圖:
(微軟任何C/C++編譯器、VC/VS這些、都支持編譯此代碼,沒有警告,沒有錯誤)
注:主函數(shù)不主函數(shù)的return都是沒有區(qū)別的
但是main函數(shù)很特別,特別在它有好多種寫法,標準C真正的主函數(shù)返回類型是int
有2個參數(shù),一個是命令行參數(shù)個數(shù),一個是命令行參數(shù)
windows下面的主函數(shù)可以有三個參數(shù),前兩個參數(shù)跟標準C一樣,第三個參數(shù)是環(huán)境變量
這些參數(shù)都是由mainCRTStartup函數(shù)傳進來的,而mainCRTStartup再往上你還要研究的話那。。。。那。。。那。。。我只能告訴你這些參數(shù)都是要操作系統(tǒng)傳進來的吧~~~
我們編程的時候,也許有些菜鳥會把main寫成如下形式:void main()
其實這種寫法在編譯之后都是會被轉(zhuǎn)化成標準寫法的底樓說的 不帶返回值系統(tǒng)默認返回0這完全是不靠譜的,因為事實當中返回值都是被寄存器eax帶出去的,而對于main是必須要返回值的,菜鳥寫了沒返回值的main在編譯之前就被編譯器替換掉了,哪來的默認返回0的說法?何來默認?系統(tǒng)會把你寫的main換成 標準main形式!標準main會在底下返回0
主函數(shù)return的值只有你在其他進程中創(chuàng)建子進程,子進程的返回狀態(tài)被父進程接收的值就是main的返回值,所以,在你寫的程序不需要被其他進程創(chuàng)建的話,main的返回值是無關緊要的
C++中,全局對象的構造函數(shù)會在main 函數(shù)之前執(zhí)行。
在大多數(shù)的實現(xiàn)方式里,核心會運行專門的啟動代碼,啟動代碼會在啟動main()之前完成所有的初始化工作,這其中當然包括了全局對象的初始化。
這個所謂的啟動代碼就是Runtime函數(shù)庫的Startup代碼。
擴展資料:
簡介
程序執(zhí)行總是從main函數(shù)開始,如果有有其他函數(shù),則完成對其他函數(shù)的調(diào)用后再返回到主函數(shù),最后由main函數(shù)結束整個程序。
在執(zhí)行程序時,由系統(tǒng)調(diào)用main函數(shù),main 函數(shù)是在程序啟動中完成對具有靜態(tài)存儲期的非局部對象的初始化之后被調(diào)用的,main函數(shù)是程序在有宿主 (hosted)環(huán)境(亦即有操作系統(tǒng))中所指定的入口點。
參考資料來源:百度百科-main函數(shù)
從語言的角度來說,程序執(zhí)行時由_mainCRTStartup開始,_mainCRTStartup初始化C運行時庫并調(diào)用main,main退出到_mainCRTStartup后調(diào)用exit來終止程序。
從操作系統(tǒng)的調(diào)度來說,由一個啟動函數(shù)調(diào)用_mainCRTStartup,比如在Windows中是BaseProcessStart。
從編程的角度來說,程序主邏輯從main開始,關于初始化C運行時庫及退出程序的任務不用用戶來操心,不過你也可以在程序運行中調(diào)用exit來結束程序
c語言最基本的格式,可以參考最基本的hello
world程序。hello
world程序雖然小,但是幾乎包含和計算機軟件技術相關的各種基礎知識。
#include
int main()
{
printf("hello world\n");
return 0;
}1、#include
預處理操作,談到預處理操作,就需要了解c語言編譯器生成二進制可執(zhí)行文件的過程,一般為預處理階斷、編譯階斷、匯編階斷、鏈接階斷。
預處理階斷:進行預處理操作,有預處理器來完成。
編譯階斷:有c語言編譯器完成,它負責將c語言源碼轉(zhuǎn)換成匯編指令。要深入下去就是編譯原理知識。
匯編階斷:有匯編器完成,它負責將匯編指令轉(zhuǎn)換成二進制機器碼。要深入下去就是匯編語言以及反匯編、調(diào)試技術的內(nèi)容
鏈接階斷:有鏈接器完成,它負責將二進制機器碼裝載成一個可執(zhí)行文件,如果要深入的探索下去,就是windows或者linux平臺上的庫編程以及相可執(zhí)行文件格式的學習,比如windows平臺的pe文件格式,如果把pe格式搞明白,自己可以直接用二進制編寫一個程序,這沒有不可思議,實際上是網(wǎng)上有這方面的帖子。
2、int
main()
每個c語言程序有且只有一個main函數(shù),一般的教科書上只有一句:“有系統(tǒng)調(diào)用main函數(shù)”,
那么到底
是系統(tǒng)中的誰調(diào)用了此函數(shù),如此深入下去,可以加深對應用程序執(zhí)行的理解,實際上在linux平臺上有,_start()函數(shù)調(diào)用main函數(shù),在windows平臺上有啟動函數(shù)maincrtstartup函數(shù)來調(diào)用main函數(shù)。
3、printf("hello
world\n")
這是c語言的成功之處之一,c語言將輸入、輸出操作設置為一個標準,這大大方便了應用程序開發(fā),也提高了應用程序的可稱植性。自己有興趣可以深入的去探索。
4、return
return
0,返回值的0表示程序執(zhí)行成功了。