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

C語言奇葩表達式大揭秘:sizeof、逗號運算符與運算符優先級陷阱

     編輯:關於C語言

C語言奇葩表達式大揭秘:sizeof、逗號運算符與運算符優先級陷阱

C 語言允許寫出極其「反直覺」的合法表達式,本文通過三個經典片段,揭開 sizeof 操作數規則、逗號運算符副作用、賦值與逗號優先級的神秘面紗。

片段一:sizeof 的操作數「免括號」特權

int a = 1;
int *q = &a;
int p = N * sizeof *q;   // 合法!sizeof 後跟變量可省略括號
// int p = N * sizeof (int)*q; // 錯誤理解:這不是轉型,而是 sizeof(int) * *q

規則: sizeof 後若為變量/表達式可不加括號;若為類型關鍵字(如 int、float*)必須加括號。

片段二:逗號運算符的「偷梁換柱」

int i;
i = 1, 3;   // 等價於 (i = 1), 3
printf("i = %d\n", i);  // 輸出 1,而非 3!

原理: = 優先級高於 ,,所以先執行賦值,逗號右側 3 只是無副作用表達式被丟棄。
正確寫法: i = (1, 3); 利用括號強制逗號先執行,最終 i=3。

片段三:malloc 參數中的 sizeof 陷阱

// 錯誤示範
malloc(strlen(str));          // 忘記 +1 存 '\0'
malloc(sizeof(*p) * n);       // 推薦:*p 自動適配類型變更
malloc(sizeof(int) * n);      // 硬編碼類型,維護易出錯

運行輸出驗證

程序輸出截圖

最佳實踐總結

  1. sizeof 變量 不加括號,sizeof(類型) 必加括號 —— 形成肌肉記憶
  2. 逗號運算符極低優先級,**嚴禁**在賦值/傳參中不加括號直接使用
  3. 動態分配首選 malloc(n * sizeof *ptr) 模式,類型變更零修改
  4. 開啟 -Wparentheses 警告,讓編譯器幫你抓優先級錯誤

這些「奇葩」其實是 C 語言設計哲學的體現:表達式即語句,副作用即值。搞懂它們,才能寫出既精簡又安全的代碼。

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