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

C語言算術運算符詳解:除法、取模、自增自減與運算陷阱

     編輯:關於C語言

C 語言提供豐富的算術運算符,涵蓋基本四則運算、取模、自增自減等。掌握其語義細節(特別是整數除法截斷、負數取模符號、前後綴自增區別)是寫出正確代碼的基石。

基本算術運算符速查

運算符名稱結合性備註
+ - * /加減乘除左→右/ 在整數運算時截斷小數
%取模(求餘)左→右僅限整數運算元
++ --自增/自減右→左前綴/後綴語義不同

整數除法與取模的關鍵細節

  • 截斷向零:C99 規定整數除法結果向零截斷。20/7 = 2,-20/7 = -2(非 -3)。
  • 取模符號:a % b 的符號與被除數 a 相同。-20 % 7 = -6,20 % -7 = 6。
  • 浮點數參與:任一運算元為浮點型,整個表達式按浮點運算,保留小數部分。

自增/自減運算符:前綴 vs 後綴

形式操作順序表達式值
++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--))

多重副作用的未定義行為(UB)

同一表達式中對同一變量多次修改,或修改後又讀取,**行為未定義**。經典錯誤:

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,但**不可依賴**。標準建議:拆分為多條語句,明確順序。

最佳實踐

  • 避免在同一表達式中對同一變量多次自增/自減/賦值。
  • 整數除法、取模涉及負數時,務必確認 C99「向零截斷」規則。
  • 複雜表達式拆分為中間變量,提升可讀性與可移植性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved