C 語言允許寫出極其「反直覺」的合法表達式,本文通過三個經典片段,揭開 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(strlen(str)); // 忘記 +1 存 '\0' malloc(sizeof(*p) * n); // 推薦:*p 自動適配類型變更 malloc(sizeof(int) * n); // 硬編碼類型,維護易出錯

sizeof 變量 不加括號,sizeof(類型) 必加括號 —— 形成肌肉記憶malloc(n * sizeof *ptr) 模式,類型變更零修改-Wparentheses 警告,讓編譯器幫你抓優先級錯誤這些「奇葩」其實是 C 語言設計哲學的體現:表達式即語句,副作用即值。搞懂它們,才能寫出既精簡又安全的代碼。