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

C語言運算符與表達式深度解析:優先級、類型轉換與特殊運算陷阱

     編輯:關於C

運算符與表達式是 C 語言程式設計的基石。本文系統梳理運算符分類、優先級規則、類型轉換機制,並透過實例揭示前後綴自增、複合賦值、隱式轉換等易錯細節。

運算符完整分類

類別運算符說明
算術+ - * / %基本數學運算
關係> < == != >= <=比較運算,結果為 0/1
邏輯&& || !短路求值特性
位操作& | ^ ~ << >>按位運算,適用整數型別
賦值= += -= *= /= %= &= ^= |= <<= >>=右結合性,優先級極低
條件?:三目運算符,唯一三元運算符
逗號,順序求值,取最後表達式值
指標* &解引用與取址
sizeofsizeof編譯期計算型別/變數大小
特殊() [] -> .函數調用、陣列下標、結構體成員存取

運算優先級與結合性規則

  1. 函數調用、陣列下標、成員存取:最高,左結合
  2. 單目運算符:++ -- + - ! ~ (型別) * & sizeof,右結合
  3. 乘除模:* / %,左結合
  4. 加減:+ -,左結合
  5. 位移:<< >>,左結合
  6. 關係:< <= > >=,左結合
  7. 相等性:== !=,左結合
  8. 位元 AND:&,左結合
  9. 位元 XOR:^,左結合
  10. 位元 OR:|,左結合
  11. 邏輯 AND:&&,左結合
  12. 邏輯 OR:||,左結合
  13. 條件:?:,右結合
  14. 賦值:= += -= 等,右結合
  15. 逗號:,,左結合,最低

黃金法則:括號最高優先級;不確定時加括號。連續單目運算符(如 a+++b)務必用空格分隔(a++ + b 或 a + ++b)。

類型轉換機制

強制類型轉換

(型別名) 運算式   // 方式 1
(型別名)(運算式)   // 方式 2,推薦:避免運算子優先級干擾

// 例:浮點轉整數
float x = 2.5, y = 4.8;
int m = (int)(x + y);  // m = 7,先加後截斷
int n = (int)x + m/3;  // n = 2 + 2 = 4

注意:強制轉換不改變原變數型別,僅臨時用於運算。

隱式類型轉換(整數提升與常規算術轉換)

規則:低精度向高精度轉換

  • char、short → int(整數提升)
  • float → double
  • 有符號/無符號混合 → 無符號型別
  • 整數/浮點混合 → 浮點型別

特殊算術運算符:前綴 vs 後綴

形式語法運作順序表達式值
前綴自增++a先增後用增後的值
後綴自增a++先用後增增前的值
前綴自減--a先減後用減後的值
後綴自減a--先用後減減前的值
int i=6, j=6, k=6, h=6;
int m = i++;  // m=6, i=7
int n = ++j;  // n=7, j=7
int x = k--;  // x=6, k=5
int y = --h;  // y=5, h=5

賦值運算深度解析

複合賦值運算符

x *= 3 + 2;      // 等價 x = x * (3+2),優先級低於算術運算
x *= y = z = 4;  // 右結合:z=4 → y=4 → x=x*4
z = x++ - 1;     // z = x-1 後 x++
z = x++ * ++y;   // y++ → z=x*y → x++

賦值轉換規則


int a, b = 322;
float x, y = 8.88;
char c1 = 'k', c2;

a = y;   // float→int,截斷小數,a=8
x = b;   // int→float,x=322.0
a = c1;  // char→int,ASCII 值,a=107
c2 = b;  // int→char,截取低 8 位,c2=66 ('B')

常見陷阱與最佳實踐

  1. 除法陷阱:整數相除結果為整數,5/2=2。需 5.0/2 或 (float)5/2
  2. 副作用順序未定義:a = b++ + ++b 行為未定義,嚴禁單語句多次修改同一變數
  3. 有符號/無符號比較:-1 > 0U 為真(-1 轉為大無符號數)
  4. 浮點精度:0.1 + 0.2 != 0.3,比較需用 epsilon

熟練掌握運算符優先級、類型轉換規則與副作用陷阱,是寫出正確、高效、可維護 C 代碼的前提。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved