運算符分類總覽
| 類別 | 運算符 | 說明 |
| 算術 | + | 加 / 一元正 |
- | 減 / 一元負 |
* | 乘 |
/ | 除 |
% | 取模 (僅整數) |
++ | 自增 (前綴/後綴) |
-- | 自減 (前綴/後綴) |
| 關係 | > >= < <= | 大於/大於等於/小於/小於等於 |
== != | 等於/不等於 |
| 邏輯 | && | 邏輯與 (短路) |
|| | 邏輯或 (短路) |
! | 邏輯非 |
| 位運算 | & | 按位與 |
| | 按位或 |
^ | 按位異或 |
~ | 按位取反 |
<< >> | 左移 / 右移 |
| 特殊 | ? : | 條件運算符 (三目) |
, | 逗號運算符 |
sizeof | 類型/變量佔用字節數 |
& * | 取址 / 解引用 |
= += -= *= /= %= ... | 賦值 / 複合賦值 |
重點難點深度講解
1. 整數除法與取模陷阱
15 / 2 // = 7 (截斷向零)
15 % 2 // = 1
-15 / 2 // = -7 (C99 標準:向零截斷)
-15 % 2 // = -1 (符號跟隨被除數)
浮點數不能用 %,需用 fmod()。
2. 自增自減:前綴 vs 後綴
int a = 5, b;
b = ++a; // a=6, b=6 (先增後用)
b = a++; // a=6, b=5 (先用後增)
// 經典面試題
int x = 5;
x = ++x + x++ + --x; // 未定義行為 (UB)!同一序列點多次修改同一變量
// 切記:不要在一條語句中對同一變量多次 ++/--
3. 賦值中的隱式類型轉換
- 右值轉換為左值類型:
int i = 3.14; // i=3,float f = 5; // f=5.0。
- 整數除法陷阱:
float f = 5 / 2; // f=2.0 → 必須 5.0 / 2 或 (float)5 / 2。
- 字符參與運算自動轉 ASCII 碼:
'c' - 'a' + 'A' = 'C'。
4. 關係與邏輯運算的真值規則
- C 語言:0 為假,非 0 為真。關係/邏輯運算結果:真為 1,假為 0。
- 短路求值:
&& 左側假則不算右側;|| 左側真則不算右側。利用此特性:if (p != NULL && p->len > 0)。
5. 位運算實戰模式
| 操作 | 代碼 | 場景 |
| 置位 | x |= (1 << n); | 開啟標誌、配置寄存器位 |
| 清位 | x &= ~(1 << n); | 關閉標誌、清除中斷標誌 |
| 翻轉 | x ^= (1 << n); | LED 閃爍、協議位翻轉 |
| 取位 | (x >> n) & 1; | 讀取按鍵、解析協議字段 |
| 掩碼 | x & mask; | 保留特定位域 |
| 乘除 2^n | x << n; x >> n; | 優化編譯器無法優化的定點運算 |
6. 條件運算符 ? :
max = (a > b) ? a : b; // 求最大值
grade = (score >= 60) ? 'P' : 'F'; // 分級
// 嵌套慎用,超過兩層改用 if-else
7. 逗號運算符 ,
// 只取最右表達式值
int x = (1, 2, 3); // x = 3
// 常用於 for 循環多變量初始化/更新
for (i = 0, j = 10; i < j; i++, j--) ...
8. sizeof 運算符
- 編譯期計算,返回類型/變量佔用字節數 (
size_t)。
sizeof(int) 需括號;sizeof x 變量可不加括號。
- 數組參數退化為指針:
void f(int a[10]) { sizeof(a); } // = 4/8 (指釖大小)。
Turbo C / 標準 C 運算符優先級與結合性 (從高到低)
| 優先級 | 運算符 | 說明 | 結合性 |
| 1 | () [] . -> | 括號、下標、結構成員、指針成員 | 左→右 |
| 2 | ! ~ ++ -- + - & * sizeof (type) | 一元運算符 (邏輯非、取反、自增減、正負、取址、解引用、sizeof、強制轉型) | 右→左 |
| 3 | * / % | 乘除模 | 左→右 |
| 4 | + - | 加減 | 左→右 |
| 5 | << >> | 移位 | 左→右 |
| 6 | < <= > >= | 關係比較 | 左→右 |
| 7 | == != | 相等比較 | 左→右 |
| 8 | & | 按位與 | 左→右 |
| 9 | ^ | 按位異或 | 左→右 |
| 10 | | | 按位或 | 左→右 |
| 11 | && | 邏輯與 | 左→右 |
| 12 | || | 邏輯或 | 左→右 |
| 13 | ? : | 條件運算符 | 右→左 |
| 14 | = += -= *= /= %= &= ^= |= <<= >>= | 賦值/複合賦值 | 右→左 |
| 15 | , | 逗號 | 左→右 |
避坑金句
- 不確定優先級就加括號 — 可讀性第一,編譯器優化不受影響。
- 浮點數不直接用 == 比較 — 用
fabs(a-b) < EPS。
- 移位位數 ≥ 位寬是 UB — 防禦性編程檢查。
- 有符號數右移是算術移位 (補符號位),跨平台可移植代碼用無符號數移位。
- 同一序列點多次修改同一變量 = UB —
i = i++ + ++i; 絕對禁止。
熟練掌握運算符優先級、類型轉換規則、位運算技巧,是寫出高效、無 Bug、可移植 C 代碼的核心基本功。