問題場景
球從 100m 高度落下,每次反彈至原高度一半。求第 10 次落地總經過距離與第 10 次反彈高度。
錯誤代碼關鍵行
double s = 100, l = 100;
for (i = 1; i <= 9; i++) {
l = (1/2) * l; // ❌ 整數除法:1/2 = 0
s = s + 2*l;
}
錯誤本質
1 和 2 均為 int 字面常量
- C 標準規定:**整數除法向零截斷**,
1/2 = 0
- 導致
l = 0 * l = 0,後續計算全為 0
修正方案(任選一)
| 寫法 | 原理 | 推薦度 |
l = (1.0/2.0) * l; | 雙精度字面量,強制浮點除法 | ⭐⭐⭐⭐⭐ |
l = 0.5 * l; | 直接用小數字面量 | ⭐⭐⭐⭐ |
l = l / 2.0; | 除數為浮點數,提升運算精度 | ⭐⭐⭐⭐ |
l *= 0.5; | 復合賦值,簡潔高效 | ⭐⭐⭐⭐⭐ |
完整修正程序
#include
int main() {
double height = 100.0; // 當前高度
double total = 100.0; // 總距離(首次下落)
for (int i = 1; i <= 9; i++) { // 第 2~10 次落地
height *= 0.5; // 反彈高度
total += 2 * height; // 上升+下降
}
printf("第10次反彈高度: %.2f 米\n", height * 0.5); // 第10次落地後反彈
printf("第10次落地總距離: %.2f 米\n", total);
return 0;
}
通用避坑原則
- 字面量帶小數點:
1.0、0.5、2.0 明確浮點類型
- 強制類型轉換:
(double)a / b 確保浮點除法
- 開啟編譯器警告:
-Wconversion 可檢測隱式精度損失
- 常量預計算:
#define HALF 0.5 避免重複字面量
整數除法截斷是 C/C++ 乃至多數靜態類型語言的**基石語義**,而非缺陷。熟記「整數除整數得整數」,在涉及比例、比率計算時務必引入浮點數。
- 上一篇文章: C語言學習難度科學評估:為什麼說「難在指針,易在語法」
- 下一篇文章: NOIP/CSP 算法競賽 C++ 知識體系全景圖:從入門到省隊的完整學習路線
Copyright ©
程式碼之家 All Rights Reserved