| 運算符 | 名稱 | 功能 | 要求 |
/ | 除法 | 得**商** (quotient) | 運算元可為整數或浮點數 |
% | 取模/取余 | 得**余數** (remainder) | **運算元必須為整數類型** |
正數例子:2 和 3
int a = 2, b = 3;
printf("2 / 3 = %d\n", a / b); // 輸出 0 (整數除法向零截斷)
printf("2 %% 3 = %d\n", a % b); // 輸出 2 (余數 = 被除數 - 商*除數 = 2 - 0*3 = 2)
- 整數除法:
2 / 3 = 0(向零截斷,非向下取整)。
- 取模:
2 % 3 = 2。余數範圍:0 ≤ |余數| < |除數|,符號**與被除數相同** (C99 規定)。
負數情況(重點考點、易錯)
C99 規定:**整數除法向零截斷**,余數滿足 (a/b)*b + a%b == a,**余數符號同被除數**。
| 表達式 | 商 (a/b) | 余數 (a%b) | 驗證: 商*除數 + 余數 |
7 / 3 | 2 | 1 | 2*3 + 1 = 7 ✅ |
-7 / 3 | -2 | -1 | (-2)*3 + (-1) = -7 ✅ |
7 / -3 | -2 | 1 | (-2)*(-3) + 1 = 7 ✅ |
-7 / -3 | 2 | -1 | 2*(-3) + (-1) = -7 ✅ |
**記憶口訣**:商向零取整,余數符號跟被除數(第一個數)。
浮點數除法
double x = 2.0, y = 3.0;
printf("2.0 / 3.0 = %f\n", x / y); // 0.666667
// 浮點數無 % 運算符,需用 fmod(x, y) ()
實際應用場景
- 判斷奇偶:
if (n % 2 == 0) // 偶數(負奇數 -3 % 2 == -1,非 1,故判斷奇數用 n % 2 != 0)。
- 循環取模:
index = (index + 1) % N; 實現環形緩衝區。
- 提取數字位:
digit = num % 10; 取個位,num /= 10; 右移。
- 時間換算:
sec = total % 60; min = total / 60 % 60; hour = total / 3600;。
- 哈希映射:
bucket = hash(key) % TABLE_SIZE;。
陷阱與最佳實踐
- 除數為 0:
/ 和 % **均導致未定義行為 (UB) / 運行時異常 (SIGFPE)**,**必須預判檢查**。
- 負數取模可移植性:C89 允許實現定義余數符號,C99 統一為「同被除數」。跨平台代碼**不要依賴負數余數具體值**,或自行實現模運算(如
((a % b) + b) % b 得非負余數)。
- 浮點數精度:
0.1 + 0.2 != 0.3,金融計算用定點數/整數分位或 decimal 庫。
- 優化:編譯器會將
x / 2 優化為 x >> 1(無符號/正數),x % 2 優化為 x & 1。
總結
/ 求商,% 求余,**整數除法向零截斷,余數符號同被除數 (C99)**。
例子:2 / 3 = 0,2 % 3 = 2;-7 / 3 = -2,-7 % 3 = -1。
**除數為 0 是致命錯誤**,負數余數跨平台需謹慎。掌握數學定義 (a/b)*b + a%b == a 即可推導所有情況。
- 上一篇文章: C語言基礎面試題詳解:sizeof、malloc、strcmp 與基本類型大小
- 下一篇文章: C語言排序算法對決:冒泡排序 vs 選擇排序,誰效率更高?
Copyright ©
程式碼之家 All Rights Reserved