C 語言功能強、靈活,編譯器語法檢查相對寬鬆,給了程式設計師「自由」,卻也埋下無數地雷。以下整理 18 個高頻錯誤,助你繞過調試深坑。
int a=5; printf("%d",A); → a 與 A 是不同變數。慣例:巨集全大寫,變數小寫。float a,b; a%b; → % 僅支援整數型別。char c; c="a"; → 'a' 是單字元,"a" 含 'a' 與 '\0' 兩字元,不可賦值給 char。= vs ==:if (a=3) 是賦值(值為 3,恆真),非比較。正確:if (a==3)。; 結尾。複合語句最後一句也需分號(異於 Pascal)。if (a%3==0); i++; → if 體為空語句,i++ 無條件執行。for(i=0;i<5;i++); {scanf...} → 迴圈體為空,僅輸入/輸出一次。} 後不加分號。scanf 忘 &:scanf("%d%d",a,b); 錯誤,應為 &a, &b(傳遞位址)。scanf("%d%d",...) 輸入需用空白/換行/Tab 分隔,不可用逗號。scanf("%d,%d",...) 則必須輸入逗號。scanf("a=%d,b=%d",...) 需輸入 a=3,b=4。%c 輸入陷阱:scanf("%c%c%c",...) 輸入 a b c → 讀到 'a', ' ', 'b'。%c 不吃空白,若需跳過空白用 " %c"。int a; float b; printf("%f%d",a,b); 編譯不報錯,執行結果錯亂。嚴格對應 %d/%f/%ld 等。scanf 不可指定精度:scanf("%7.2f",...) 非法。switch 漏 break:無 break 會貫穿執行後續 case。每個分支務必加 break;。while vs do-while 差異:while 先判斷後執行;do-while 先執行一次再判斷。輸入 >10 時行為不同。int n; scanf("%d",&n); int a[n]; → C89 不支援 VLA(變長陣列),需常數運算式。int a[10]; a[10] → 下標 0~9,a[10] 不存在。int a[3]={0,1,2}; 錯誤,應 static int a[3]={0,1,2}; 或外部連結。&:scanf("%s",&str); → 陣列名 str 已是位址,正確 scanf("%s",str);。int max(x,y) int x,y,z; {…}int max(x,y) int x,y; { int z; … }這些地雷多源於對 C 語法細節理解不透。建議:養成「嚴格型別思維」、「分號肌肉記憶」、「scanf 必加 &(字串除外)」、「switch 必加 break」等好習慣。閱讀《高質量 C/C++ 編程指南》等規範可事半功倍。