當我們在學 C 語言的時候,都會自然地將 main()
的 return 型別宣告為 int
,但是為什麼是這個樣子呢?
讓我們來看看:
C 語言當中關於 main() 的規範與說明
在 C 的標準文件裡面有一段話是這樣,
5.1.2.2.1 Program startup
The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:
int main(void) {
/* ... */
}
or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) {
/* ... */
}
or equivalent[1]; or in some other implementation-defined manner.
其中就有提到 main()
這隻程式的傳回值需要是 int
型態。
如果不是的話, 迂腐標準的 C compiler 會給你/妳口頭警告(但是還是可以編譯出執行檔),見下圖。
還有另一段話說:
If the return type of the
main
function is a type compatible withint
, a return from the initial call to themain
function is equivalent to calling theexit
function with the value returned by themain
function as its argument; reaching the}
that terminates themain
function returns a value of 0. If the return type is not compatible withint
, the termination status returned to the host environment is unspecified.
大致上的意思是:當 main()
的傳回值真的是 int
型態(或者可以被當作[2] int
)的話,
程式在
return 0;
或者是執行到 main()
的右大括號後,會跳去執行
exit(0);
(如果在程式結束前先執行 return 1;
就會跳去執行 exit(1)
,關於 exit()
請參考這邊)
用途
exit()
的主要任務是將 main()
程式結束時的回傳(return
)值,
交給執行這隻程式的程式他爹娘(parent)。
主要是 parent 可能需要透過這個回傳值知道程式執行的結果,
main(){ return 0;}
// ∟ exit(0)
// ∟ parent 得到執行結果 0
像是 return 0
通常是成功,1
可能代表失敗,65
可能代表小朋友考了一個 'A'
。
(有的作業系統也會定義這些值應該是什麼意思)
有的時候還會發生程式還沒執行結束就被殺掉的情況
像是上面的 a.out 執行到一半就被下面的 kill -11
殺掉
程式在還沒有執行到最後或者 return
前就被強制中止的話,
exit()
這時候就會回傳中止原因給 parent,
像這邊是 139
(11 + 128,說明在這),
跟 parent 說我跑到一半被人給砍了。
話說如果 parent 沒有去看 ( wait()
) 死亡報告的話,
你的程式就會變身成 zombie
,
想知道更多請 google "zombie process"。
後記
特別感謝:屠博士書維對本文的武術指導。
參考資料:http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c