| 標準 | 合法簽名 | 備註 |
| C89 | main() / int main() | 隱式 int,已淘汰 |
| C99 | int main(void) / int main(int argc, char* argv[]) | 現代 C 基準 |
| C++98/11/14/17/20 | int main() / int main(int argc, char* argv[]) | int main() 等同 int main(void) |
嚴禁:void main()、float main()、main() 無回傳型別(C++ 不允許隱式 int)。
回傳值約定
0 / EXIT_SUCCESS:正常結束。
- 非零 /
EXIT_FAILURE:異常結束(具體碼可自定義錯誤類型)。
- Shell 檢測:
echo $? (Linux) / echo %ERRORLEVEL% (Windows)。
- 串聯執行:
prog1 && prog2(prog1 回傳 0 才執行 prog2),prog1 || prog2(prog1 非 0 才執行 prog2)。
隱式回傳 0(C99 / C++98 起)
若 main 結尾無 return,編譯器**自動插入 return 0;**。但**明確寫出**是良好習慣(VC6 等舊編譯器不支援)。
return 型別對應表
| 函數回傳型別 | return 運算元型別 | 範例 |
int | 整數常數/變數/運算式 | return 0; return x+y; |
double | 浮點數 | return 3.14; |
char | 字元 | return 'A'; |
struct T | 同型別物件/臨時物件 | return T{1,2}; |
void | **不可有運算元** | return; 或流程自然結束 |
常見錯誤
- ❌
void foo() { return 1; } → 編譯錯誤。
- ❌
int foo() { if (cond) return 1; } 缺少預設回傳 → 未定義行為(C++ 流程落出非 void 函數為 UB)。
- ❌
main() { return 1.5; } → 隱性轉換截斷,回傳 1,語義混淆。
- ❌
void main() → 非標準,移植性極差。
總結
main **必須宣告為 int**,回傳 0 表示成功。
- 非
void 函數**所有路徑必須回傳值**(C++ 強制,C 為 UB)。
return 即時跳出函數,善用於提前退出簡化邏輯(衛語句)。
- 拒絕
void main(),堅持標準簽名,保證跨平台正確性。
- 上一篇文章: C 語言 scanf 格式輸入函數完整指南
- 下一篇文章: C 語言 gets 函數用法與安全替代方案
Copyright ©
程式碼之家 All Rights Reserved