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

C 語言運算符 |= 與 -> 含義詳解:位元或賦值與結構體指標成員存取

     編輯:C 語言問答

C 語言運算符 |= 與 -> 含義詳解

這兩個運算符雖形式相似(含 = 或 -),但語意完全不同:|= 是複合位元或賦值,-> 是結構體指標成員存取。本文逐一拆解語法、語意、優先級與實戰用法。

運算符一:|= 複合位元或賦值

定義與等價展開


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% 的位元操作與指標追鏈代碼。

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