C 語言提供豐富的算術運算符,涵蓋基本四則運算、取模、自增自減等。掌握其語義細節(特別是整數除法截斷、負數取模符號、前後綴自增區別)是寫出正確代碼的基石。
| 運算符 | 名稱 | 結合性 | 備註 |
|---|---|---|---|
| + - * / | 加減乘除 | 左→右 | / 在整數運算時截斷小數 |
| % | 取模(求餘) | 左→右 | 僅限整數運算元 |
| ++ -- | 自增/自減 | 右→左 | 前綴/後綴語義不同 |
20/7 = 2,-20/7 = -2(非 -3)。a % b 的符號與被除數 a 相同。-20 % 7 = -6,20 % -7 = 6。| 形式 | 操作順序 | 表達式值 |
|---|---|---|
++i / --i | 先增/減,後參與運算 | 新值 |
i++ / i-- | 先參與運算,後增/減 | 舊值 |
int i = 8;
printf("%d\n", ++i); // 9
printf("%d\n", --i); // 8
printf("%d\n", i++); // 8 (輸出後 i 變 9)
printf("%d\n", i--); // 9 (輸出後 i 變 8)
printf("%d\n", -i++); // -8 (等價 -(i++))
printf("%d\n", -i--); // -9 (等價 -(i--))
同一表達式中對同一變量多次修改,或修改後又讀取,**行為未定義**。經典錯誤:
int i = 5;
int p = (i++) + (i++) + (i++); // UB!編譯器輸出可能為 15、16、17 等
int q = (++j) + (++j) + (++j); // UB!同理
實測 VC6.0/MinGW 下 p=15, q=22,但**不可依賴**。標準建議:拆分為多條語句,明確順序。