核心概念釐清
int main() {
float a = 2.0;
printf("%f", a); // 輸出:2.000000
return 0;
}
兩個不同層面的「回傳」
| 層面 | printf 輸出 | main 回傳值 |
| 用途 | 向使用者/標準輸出顯示資訊 | 向作業系統/父程序回報執行狀態 |
| 類型 | 格式化字串,可輸出任意型別 | 整數(int),通常 0=成功、非 0=失敗 |
| 可見性 | 螢幕上直接看到 | 螢幕不顯示,需用 echo $? (Linux) 或 echo %ERRORLEVEL% (Windows) 查看 |
| 範例 | printf("%f", 2.0) → 顯示 2.000000 | return 0; → 程式結束碼 0 |
為什麼 main 回傳 int?
C 標準規定 main 回傳 int,作為程式的結束狀態碼。這是程式與作業系統溝通的協定:
return 0; 或 exit(0); → 正常結束
return 1; 或 exit(1); → 異常結束(具體錯誤碼可自定義)
驗證實驗
Linux/macOS 終端機
$ gcc test.c -o test
$ ./test
2.000000
$ echo $?
0
Windows CMD
> gcc test.c -o test.exe
> test.exe
2.000000
> echo %ERRORLEVEL%
0
Windows PowerShell
> .\test.exe
2.000000
> $LASTEXITCODE
0
常見誤區
| 誤區 | 正確理解 |
| main 回傳值會印在螢幕上 | 不會。只有 printf/puts 等輸出函式才會顯示 |
| void main() 也可以 | 不標準。C99/C11 要求 int main() 或 int main(int argc, char *argv[]) |
| 沒寫 return 0 就會報錯 | C99 起,main 結束隱含 return 0;但建議明確寫出,提高可讀性 |
| 回傳值型別影響 printf 輸出 | 完全無關。printf 看格式字串 %f,main 回傳 int 給 OS |
實務應用:腳本判斷程式執行結果
# Linux Shell 腳本範例
./my_program
if [ $? -eq 0 ]; then
echo "程式成功執行"
else
echo "程式異常結束,錯誤碼: $?"
fi
標準簽名完整形式
// 完整標準形式(支援命令列參數)
int main(int argc, char *argv[]) {
// argc: 參數個數(含程式名)
// argv: 參數字串陣列,argv[0] 為程式名
return 0;
}
總結
- printf:給人看的(標準輸出)
- return 0:給作業系統看的(結束狀態)
- 兩者完全獨立,互不干擾
- 養成習慣:
int main() { ... return 0; }
「程式的輸出是給使用者的禮物,回傳碼是給作業系統的承諾。」—— 區分兩者,是從寫代碼走向工程思維的關鍵一步。