|= 與 -> 含義詳解這兩個運算符雖形式相似(含 = 或 -),但語意完全不同:|= 是複合位元或賦值,-> 是結構體指標成員存取。本文逐一拆解語法、語意、優先級與實戰用法。
|= 複合位元或賦值
a |= b; // 等價於 a = a | b;
| 為位元或:對應位元任一為 1 則結果為 1。
#define FLAG_READ 0x01 // 0000 0001
#define FLAG_WRITE 0x02 // 0000 0010
#define FLAG_EXEC 0x04 // 0000 0100
unsigned char flags = 0;
flags |= FLAG_READ; // flags = 0x01
flags |= FLAG_WRITE; // flags = 0x03 (0000 0011)
flags |= FLAG_EXEC; // flags = 0x07 (0000 0111)
// 檢查
if (flags & FLAG_WRITE) { /* 可寫 */ }
a |= b + c 等價 a |= (b + c),非 (a | b) + c-> 結構體指標成員存取
struct Node { int val; struct Node *next; };
struct Node *p = malloc(sizeof(struct Node));
p->val = 42; // 等價於 (*p).val = 42;
p->next = NULL; // 等價於 (*p).next = NULL;
.、()、[]),左結合
for (struct Node *cur = head; cur != NULL; cur = cur->next) {
printf("%d ", cur->val);
}
| 特性 | |= | -> |
|---|---|---|
| 全名 | 複合位元或賦值運算符 | 結構體指標成員存取運算符 |
| 運算元數 | 2(左值、右值) | 2(指標、成員名) |
| 結果 | 左運算元新值(位元或結果) | 成員左值(可讀寫) |
| 典型用途 | 標誌位設置、權限掩碼 | 鏈表、樹、圖節點操作 |
| 優先級 | 極低 (15/16) | 極高 (2/16) |
p->flags |= MASK
// 正確解析順序(按優先級):
// 1. p->flags (最高優先級)
// 2. |= MASK (最低優先級)
p->flags |= MASK; // 等價於 (p->flags) = (p->flags) | MASK;
// 設置節點 p 的 flags 標誌位
|= 操作位元模式,是系統程式設計中標誌位操作的基石;-> 操作資料結構拓撲,是鏈式結構操作的核心語法。掌握兩者的優先級差異(天壤之別)、等價展開形式、典型應用模式,能讀懂 Linux 核心、嵌入式驅動、高效能庫中 90% 的位元操作與指標追鏈代碼。