計(jì)算機(jī)二級(jí)考試C語(yǔ)言輔導(dǎo):幫你徹底搞清main()返回值問(wèn)題

字號(hào):

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