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]
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; // 防除零
}
| 編譯器 | 警告等級 | 提示信息 |
|---|---|---|
| GCC/Clang -Wall | Warning | this ‘for’ clause does not guard… [-Wempty-body] |
| MSVC /W4 | Warning | C4390: ‘;’ : empty controlled statement found |
| VS默認 | 無 | 無提示(極易漏檢) |
一個分號毀掉整個算法。養成「控制語句必加大括號」的肌肉記憶,讓編譯器幫你守住底線。