運算符是表達式計算的原子單元。本文收錄 sizeof 運算符語義、複合賦值簡寫規則、以及 **Turbo C 完整優先級與結合性表** (15 級),並給出複雜表達式求值實例,作為編寫無歧義表達式的權威參考。
sizeof 運算符size_t (無符號整數),單位:**位元組**。| 操作數 | 結果 (16-bit 系統典型) |
|---|---|
sizeof(double) | 8 |
sizeof(int) | 2 |
float f; sizeof(f) | 4 |
int a[10]; sizeof(a) | 20 (整個數組大小) |
int *p; sizeof(p) | 2/4/8 (指針大小,視模式/架構) |
核心用途:動態分配 malloc(n * sizeof(T))、結構體對齊分析、跨平台可移植代碼。
簡化 var = var op expr 為 var op= expr,**僅求值 var 一次** (對副作用表達式有區別)。
| 簡寫 | 等價展開 | 適用運算符 |
|---|---|---|
a += b | a = a + b | 所有二元算術/位運算符 |
a -= b | a = a - b | |
a *= b | a = a * b | |
a /= b | a = a / b | |
a %= b | a = a % b | |
a &= b | a = a & b | |
a |= b | a = a | b | |
a ^= b | a = a ^ b | |
a <<= b | a = a << b | |
a >>= b | a = a >> b |
注意:a /= b - c 等價 a = a / (b - c),**非** a = a / b - c,複合賦值優先級**最低** (見下表)。
優先級**由高到低**,同級按結合性結合。
| 級 | 運算符 | 說明 | 結合性 |
|---|---|---|---|
| 1 | () [] . -> | 括號、下標、結構成員、指針成員 | 左→右 |
| 2 | ! ~ - (負) ++ -- & (取址) * (解引用) (type) sizeof | 單目運算符、類型轉換、sizeof | 右→左 |
| 3 | * / % | 乘除模 | 左→右 |
| 4 | + - | 加減 | 左→右 |
| 5 | << >> | 位移 | 左→右 |
| 6 | < <= > >= | 關係比較 | 左→右 |
| 7 | == != | 相等比較 | 左→右 |
| 8 | & | 位與 | 左→右 |
| 9 | ^ | 位異或 | 左→右 |
| 10 | | | 位或 | 左→右 |
| 11 | && | 邏輯與 (短路) | 左→右 |
| 12 | || | 邏輯或 (短路) | 左→右 |
| 13 | ?: | 條件運算符 | 右→左 |
| 14 | = += -= *= ... (所有複合賦值) | 賦值 | 右→左 |
| 15 | , | 逗號運算符 (順序求值,取最後值) | 左→右 |
10 > 4 && !(100 < 99) || 3 <= 5
/* 步驟:
1. 10>4 → 1 (真)
2. 100<99 → 0 → !0 → 1
3. 1 && 1 → 1 (短路,右邊不算)
4. 3<=5 → 1
5. 1 || 1 → 1 (短路)
結果:1 */
10 > 4 && !(100 < 99) && 3 <= 5
/* 1 && 1 && 1 → 1 */
若改為 10 > 4 && !(100 < 99) && 3 > 5 → 1 && 1 && 0 → 0。
a = 10; b = 3; c = 2;
a /= b - c; /* 等價 a = a / (b - c) = 10 / 1 = 10 */
/* 非 a = a / b - c = 3 - 2 = 1 */
| 誤區代碼 | 實際解析 | 意圖往往為 | 修正 |
|---|---|---|---|
if (a & FLAG == 0) | a & (FLAG == 0) | (a & FLAG) == 0 | 加括號 |
p->x++ | (p->x)++ (後置 ++) | 通常正確 | 確認語義 |
*p++ | *(p++) (取值後指針遞增) | (*p)++ (值遞增) | 加括號 (*p)++ |
a + b > c ? d : e | (a + b > c) ? d : e | a + (b > c ? d : e) | 加括號 |
~a + 1 | (~a) + 1 (負數補碼) | 通常正確 | 確認語義 |
運算符優先級表是編譯器解析表達式的**唯一權威**。寫代碼時:**寧可多加括號明確意圖,不可賭記憶力**。複合賦值最低優先級、單目運算符右結合、逗號運算符最低且左結合,是三大易忘鐵律。sizeof 編譯期計算、複合賦值單次求值左值,配合優先級表,讓表達式零歧義。