原始碼問題盤點
#include 缺少標頭檔名稱(應為 stdio.h)。
- 自訂函數
add main、sub main 使用 main 關鍵字導致命名衝突。
- 函數未前置宣告(prototype),編譯器假設回傳
int 並隱式轉型,極易出錯。
if (a + b) 判斷邏輯模糊:未初始化的 a,b 為亂數,且無輸入語句。
c = add main(a,b) 語法錯誤,應為 c = add(a, b)。
修正後完整程式碼
#include <stdio.h>
// 函數原型宣告
int add(int a, int b);
int sub(int a, int b);
int main(void)
{
int a, b, c;
// 範例:從標準輸入讀取兩數
printf("請輸入兩個整數:");
if (scanf("%d %d", &a, &b) != 2) return 1;
if (a + b) { // 非零視為真
c = add(a, b);
printf("c = %d\n", c);
} else {
c = sub(a, b);
printf("c = %d\n", c);
}
return 0;
}
// 定義在 main 之後亦可,因有原型宣告
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
關鍵修正說明
- 函數命名避開
main、printf 等保留/標準庫名稱。
- 所有自訂函數務必在使用前給出原型宣告(或將定義移至
main 之前)。
- 變數使用前必須初始化或透過
scanf 等賦值。
main 回傳 int,慣例成功回傳 0。
進階建議
- 開啟編譯器警告:
gcc -Wall -Wextra -pedantic -std=c11。
- 使用靜態分析工具(如
cppcheck、clang-tidy)掃描潛在問題。
- 採用一致的命名風格(如 snake_case)提升可讀性。