表達式求值完整過程
2.5 + 1 * 7 % 2 / 4
步驟 1:運算符優先級確定結合順序
* / % 同級,左結合 → ((1 * 7) % 2) / 4
+ 最後結合 → 2.5 + (((1 * 7) % 2) / 4)
步驟 2:整數子表達式求值 (int 運算)
1 * 7 = 7 (int)
7 % 2 = 1 (int, 餘數)
1 / 4 = 0 (int, 整數除法截斷向零)
整數部分結果為 0 (int)。
步驟 3:隱式類型提升 (Usual Arithmetic Conversions)
2.5 是 double 常量。
double + int → int 提升為 double → 0.0。
步驟 4:最終浮點加法
2.5 + 0.0 = 2.5 (double)
結果取決於賦值目標類型
| 目標變量類型 | 賦值結果 | 說明 |
int x | 2 | double → int 截斷小數部分 |
float x | 2.5f | double → float 精度足夠 |
double x | 2.5 | 保持原精度 |
unsigned int x | 2 | 同有符號截斷 |
關鍵知識點總結
- 整數除法向零截斷:
1/4 = 0,-1/4 = 0 (C99 規定向零)。
- % 運算符要求整數操作數,結果符號與被除數同號 (C99)。
- 混合類型運算自動提升:低精度向高精度提升 (int→float→double)。
- 賦值時再發生轉換:右值類型向左值類型轉換,可能縮窄/截斷。
- 常量字面量類型:
2.5 默認 double,2.5f 為 float,2 為 int。
驗證代碼
#include
int main() {
int i = 2.5 + 1 * 7 % 2 / 4;
float f = 2.5 + 1 * 7 % 2 / 4;
double d = 2.5 + 1 * 7 % 2 / 4;
printf("int: %d\nfloat: %f\ndouble: %f\n", i, f, d);
return 0;
}
// 輸出:
// int: 2
// float: 2.500000
// double: 2.500000
理解「整數運算在整數域完成,再參與浮點運算」是避免精度驚訝的關鍵。
- 上一篇文章: C語言前綴遞減 --a 與後綴遞減 a-- 區別詳解:副作用與序列點
- 下一篇文章: 十天入門單片機 C 語言編程:從 MAIN 函數到項目實戰學習路徑
Copyright ©
程式碼之家 All Rights Reserved