計算機二級考試C語言輔導(dǎo):幫你徹底搞清main()返回值問題

字號:

現(xiàn)在考試大編輯和大家一起討論main()函數(shù)的返回值,
    有的說必須有返回值,如:return 0;
    有的說沒有也可以,如:用void修飾main()
    但大家的討論都只留于表面,現(xiàn)在考試大編輯來試著講解一下深層含義!若有不當(dāng)之處,望高手們不吝賜教
    要想真正理解這個問題,首先要了解一下操作系統(tǒng)的外殼
    操作系統(tǒng)是由多個功能模塊組成的龐大,復(fù)雜的軟件系統(tǒng),任何通用的操作系統(tǒng),都要提供一個稱為shell(外殼)的程序,用戶(操作人員)使用這個程序來操作計算機系統(tǒng)進行工作。
    DOS中有一個程序command.com,這個程序在DOS中稱為命令解釋器,也就是DOS系統(tǒng)的shell.
    用戶的命令由command執(zhí)行,首先command把程序加入內(nèi)存,然后設(shè)置CPU的CS:IP指向程序的第一條指令(也就是程序入口,在C++中就是main()函數(shù)),從而使程序得以運行。程序結(jié)束后,返回到command中,CPU繼續(xù)運行command.注意在返回的時候要有一個返回值,這樣才能安全退出程序(注意我用的是退出一詞),之后各寄存器會有恢復(fù)動作,如果沒有返回值,雖然表面上看程序也正常結(jié)束了,但實際上它并沒有退出,各寄存器并沒有恢復(fù),如CS:IP 還是指向程序尾部,如果得到CS:IP,那么可以讓程序繼續(xù)執(zhí)行下去,但是所執(zhí)行的程序已經(jīng)不是你的代碼所在的那段內(nèi)存空間了,它在執(zhí)行其它內(nèi)存中的程序。
    在C++中,如果是void main()的話,理論上說,應(yīng)該不會正常結(jié)束,當(dāng)然,這完全是我的猜測,
    因為在匯編程序中,有int 21h的話,結(jié)束后會提示 Program terminated normally,
    意思是程序正常結(jié)束,然后在用T或P命令,將沒有指令執(zhí)行,
    如果沒有int 21h這一句,就不會有這個提示,也就是說程序沒有正常結(jié)束,
    此時用T或P命令,CS:IP將指向下一條指令,并執(zhí)行。
    類比一下,C++中也應(yīng)該是這樣,用int main()
    {……
    return 0;}的話會正常結(jié)束,
    用void main()的話,雖然也能結(jié)束,但似乎會有潛在的問題。