當我們在學 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 with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument; reaching the } that terminates the main function returns a value of 0. If the return type is not compatible with int, 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


腳註


  1. Thus, int can be replaced by a typedef name defined as int, or the type of argv can be written as char ** argv, and so on. ↩︎

  2. 如果 return 'A'; 的話,你會得到 'A' 的 ASCII value 65。你可以在 Linux 底下這樣測試: ./a.out; echo $? ↩︎