首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C語言經典錯誤:for循環分號導致數組求和邏輯失效分析

     編輯:程式設計綜合問答

錯誤代碼


float average(float array[], int n) {
    int i;
    float aver, sum = array[0];
    for (i = 1; i < n; i++);  // ❌ 這裡多了一個分號!
    sum = sum + array[i];     // 循環體為空,這行只執行一次
    aver = sum / n;
    return aver;
}

錯誤本質

`for (i = 1; i < n; i++);` 等價於:


for (i = 1; i < n; i++) {
    ;  // 空語句
}
sum = sum + array[i];  // 循環結束後 i == n,越界訪問 array[n]

後果分析

  1. 循環體為空,累加語句脫離循環
  2. 循環結束時 `i == n`,訪問 `array[n]` 發生越界(未定義行為)
  3. 若運行不崩潰,結果僅為 `array[0] + 垃圾值`,完全錯誤

正確代碼


float average(float array[], int n) {
    float sum = 0;
    for (int i = 0; i < n; i++) {  // 無分號,大括號包裹循環體
        sum += array[i];
    }
    return n > 0 ? sum / n : 0;  // 防除零
}

防範清單

  • ✅ 習慣給`for`/`while`/`if`加大括號,即使只有一條語句
  • ✅ 使用現代IDE(VS Code、CLion、VS2022)開啟「空語句警告」
  • ✅ 代碼評審時重點檢查控制語句後的分號
  • ✅ 單元測試覆蓋邊界情況(n=0,1,MAX)

編譯器警示對比

編譯器警告等級提示信息
GCC/Clang -WallWarningthis ‘for’ clause does not guard… [-Wempty-body]
MSVC /W4WarningC4390: ‘;’ : empty controlled statement found
VS默認無無提示(極易漏檢)

總結

一個分號毀掉整個算法。養成「控制語句必加大括號」的肌肉記憶,讓編譯器幫你守住底線。

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