首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言初學者必踩的 18 顆地雷:避坑指南

     編輯:關於C語言

前言:靈活背後的陷阱

C 語言功能強、靈活,編譯器語法檢查相對寬鬆,給了程式設計師「自由」,卻也埋下無數地雷。以下整理 18 個高頻錯誤,助你繞過調試深坑。

地雷清單

  1. 大小寫敏感:int a=5; printf("%d",A); → a 與 A 是不同變數。慣例:巨集全大寫,變數小寫。
  2. 型別不匹配運算:float a,b; a%b; → % 僅支援整數型別。
  3. 字元常量 vs 字串常量:char c; c="a"; → 'a' 是單字元,"a" 含 'a' 與 '\0' 兩字元,不可賦值給 char。
  4. = vs ==:if (a=3) 是賦值(值為 3,恆真),非比較。正確:if (a==3)。
  5. 漏分號:語句必須以 ; 結尾。複合語句最後一句也需分號(異於 Pascal)。
  6. 多加分號:
    • if (a%3==0); i++; → if 體為空語句,i++ 無條件執行。
    • for(i=0;i<5;i++); {scanf...} → 迴圈體為空,僅輸入/輸出一次。
    • 複合語句 } 後不加分號。
  7. scanf 忘 &:scanf("%d%d",a,b); 錯誤,應為 &a, &b(傳遞位址)。
  8. 輸入格式不符:
    • scanf("%d%d",...) 輸入需用空白/換行/Tab 分隔,不可用逗號。
    • scanf("%d,%d",...) 則必須輸入逗號。
    • scanf("a=%d,b=%d",...) 需輸入 a=3,b=4。
  9. %c 輸入陷阱:scanf("%c%c%c",...) 輸入 a b c → 讀到 'a', ' ', 'b'。%c 不吃空白,若需跳過空白用 " %c"。
  10. 輸入/輸出格式與型別不符:int a; float b; printf("%f%d",a,b); 編譯不報錯,執行結果錯亂。嚴格對應 %d/%f/%ld 等。
  11. scanf 不可指定精度:scanf("%7.2f",...) 非法。
  12. switch 漏 break:無 break 會貫穿執行後續 case。每個分支務必加 break;。
  13. while vs do-while 差異:while 先判斷後執行;do-while 先執行一次再判斷。輸入 >10 時行為不同。
  14. 陣列大小不可用變數:int n; scanf("%d",&n); int a[n]; → C89 不支援 VLA(變長陣列),需常數運算式。
  15. 下標越界:int a[10]; a[10] → 下標 0~9,a[10] 不存在。
  16. 陣列初始化需靜態儲存期:int a[3]={0,1,2}; 錯誤,應 static int a[3]={0,1,2}; 或外部連結。
  17. 字串輸入勿加 &:scanf("%s",&str); → 陣列名 str 已是位址,正確 scanf("%s",str);。
  18. 形參與區域變數同名/混淆:舊式函式定義中,形參在函式體外宣告,區域變數在體內。
    錯誤:int max(x,y) int x,y,z; {…}
    正確:int max(x,y) int x,y; { int z; … }

總結

這些地雷多源於對 C 語法細節理解不透。建議:養成「嚴格型別思維」、「分號肌肉記憶」、「scanf 必加 &(字串除外)」、「switch 必加 break」等好習慣。閱讀《高質量 C/C++ 編程指南》等規範可事半功倍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved