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

C語言整數除法陷阱:自由落體反彈問題中 1/2 歸零導致邏輯錯誤修正

     編輯:C 語言問答

問題場景

球從 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

修正方案(任選一)

完整修正程序


#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. 字面量帶小數點:1.0、0.5、2.0 明確浮點類型
  2. 強制類型轉換:(double)a / b 確保浮點除法
  3. 開啟編譯器警告:-Wconversion 可檢測隱式精度損失
  4. 常量預計算:#define HALF 0.5 避免重複字面量

整數除法截斷是 C/C++ 乃至多數靜態類型語言的**基石語義**,而非缺陷。熟記「整數除整數得整數」,在涉及比例、比率計算時務必引入浮點數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
寫法原理推薦度
l = (1.0/2.0) * l;雙精度字面量,強制浮點除法⭐⭐⭐⭐⭐
l = 0.5 * l;直接用小數字面量⭐⭐⭐⭐
l = l / 2.0;除數為浮點數,提升運算精度⭐⭐⭐⭐
l *= 0.5;復合賦值,簡潔高效⭐⭐⭐⭐⭐