五大特殊運算子
1. 條件運算子 ?: (唯一三元運算子)
expr1 ? expr2 : expr3
/* expr1 真 → expr2 值為整體值;假 → expr3 值為整體值 */
- 右結合:
a ? b : c ? d : e 解析為 a ? b : (c ? d : e)。
- 可替代簡單
if-else 賦值:max = (a > b) ? a : b;。
- 型別兼容:
expr2、expr3 需可隱性轉換為共同型別 (通常為算術轉換結果)。
範例
int x = 50;
int y = (x > 70) ? 100 : 0; /* y = 0 */
2. 取址 & 與間接 * (一元運算子,互為逆操作)
int i = 10, j, *p;
p = &i; /* p 存放 i 的位址 */
j = *p; /* 透過 p 讀取 i 的值 → j = 10 */
& 需左值 (有位址的物件),&10、&(a+b) 非法。
* 作用於指標型別,結果為指向型別的左值。
3. 逗號運算子 , (最低優先序,左結合)
expr1, expr2, expr3
/* 依序求值 expr1、expr2、expr3,整體值為 expr3 的值 */
範例
int x = 50;
int y = (x = x - 5, x / 5); /* x=45, y=9 */
/* 等價於:
x = x - 5;
y = x / 5;
*/
- 常用於
for 迴圈多變數初始化/遞增:for (i=0, j=10; i。
- 函數引數逗號不是逗號運算子,單純分隔符。
4. sizeof 運算子 (一元,編譯期常數)
sizeof(type) /* 型別運算元需括號 */
sizeof expression /* 運算式運算元可無括號 */
- 回傳
size_t (無號整數),單位為位元組 (byte, 定義為 CHAR_BIT bits,通常 8)。
- 不評估運算式 (副作用不發生):
sizeof(i++) 不會改變 i。
- 陣列不退化:
int a[10]; sizeof(a) == 10*sizeof(int)。
常見大小 (視平台而定)
sizeof(char) == 1
sizeof(short) == 2
sizeof(int) == 2 (16-bit) / 4 (32/64-bit)
sizeof(long) == 4 (32-bit) / 8 (64-bit Linux)
sizeof(long long)== 8
sizeof(float) == 4
sizeof(double) == 8
sizeof(void*) == 4 (32-bit) / 8 (64-bit)
5. 複合賦值運算子 op=
a += b ≡ a = a + b (但 a 僅評估一次)
a &= b ≡ a = a & b
a /= b-c ≡ a = a / (b - c) /* 優先序:賦值最低,右側先算 */
- 適用於所有二元算術、位元、移位運算子。
- 單次評估 左運算元:
a[i++] += 1 中 i++ 只執行一次。
完整優先序表 (15 層,高 → 低)
1 () [] . -> /* 後綴:函數呼叫、下標、結構成員 */
2 ++ -- + - ~ ! * & sizeof (type) /* 一元:前綴遞增減、正負、邏輯非、位元非、間接、取址、sizeof、型別轉換 */
3 * / % /* 乘法性 */
4 + - /* 加法性 */
5 << >> /* 移位 */
6 < <= > >= /* 關係 */
7 == != /* 等值 */
8 & /* 位元 AND */
9 ^ /* 位元 XOR */
10 | /* 位元 OR */
11 && /* 邏輯與 (短路) */
12 || /* 邏輯或 (短路) */
13 ?: /* 條件 (右結合) */
14 = += -= *= /= %= &= ^= |= <<= >>= /* 賦值 (右結合) */
15 , /* 逗號 (最低,左結合) */
優先序實戰驗證
/* 原教材範例修正 */
10 > 4 && !(100 < 99) || 3 <= 5
/* 100<99=0 → !0=1 → 10>4=1 → 1&&1=1 → 3<=5=1 → 1||1=1 → 結果 1 */
10 > 4 && !(100 < 99) && 3 <= 5
/* 1 && 1 && 1 = 1 → 結果 1 (原教材誤植為 0) */
避坑指南
- 括號消除歧義:寫
(a + b) * c 而非依賴優先序。
- 條件運算子嵌套加括號:
a ? (b ? c : d) : e。
- 逗號運算子僅用於 for/巨集,一般陳述句用分號分隔更清晰。
- sizeof 不評估運算式:
sizeof(func()) 不會呼叫 func。
- 複合賦值左運算元單次評估:
p[i++] += 1 安全。