在 C 語言中,sizeof 同時是 關鍵字、運算符 (操作符),但 絕非函數。這一特殊身份決定了其獨特的語法行為與編譯期計算特性。本文引用 C 標準文檔 (ISO/IEC 9899) 逐項論證。
C 標準 §6.4.1 關鍵字列表明確收錄 sizeof。這意味著:
int sizeof = 1; 編譯錯誤。C 標準 §6.5.3.4 定義 sizeof 為一元運算符,結合性 自右向左。其運算對象可以是:
sizeof(int)、sizeof(struct Foo)。sizeof x、sizeof a + b (等價 sizeof (a + b))。運算結果類型為 size_t (無符號整數),值為運算對象在當前編譯目標平台佔用的位元組數 (位元組定義為 CHAR_BIT 位,通常為 8)。
誤以為是函數源於 sizeof(int) 類函數調用語法。三大鐵證打破幻覺:
int i; sizeof i; 合法編譯並運行。若為函數,參數必須加括號。sizeof 結果在編譯期確定 (VLA 除外),無運行期函數調用開銷。sizeof(foo()) 不會調用 foo(),僅推導其返回類型大小。sizeof 'A' 返回 sizeof(int) (通常 4),因字元常數在 C 中為 int 類型;若為函數則會發生整數提升規則,但本質不同。| 形式 | 合法性 | 說明 |
|---|---|---|
sizeof int | ❌ 錯誤 | 型別名稱必須加括號 |
sizeof(int) | ✅ 合法 | 型別運算對象 |
sizeof i | ✅ 合法 | 運算式運算對象 (變數) |
sizeof (i) | ✅ 合法 | 運算式加括號無影響 |
sizeof a + b | ✅ 合法 | 等價 sizeof (a + b),右結合性 |
sizeof 'A' == sizeof(int) (C) vs sizeof(char) (C++)。跨語言代碼慎用。void f(int a[]) 內 sizeof(a) 返回指標大小而非陣列大小。需傳遞長度或使用模板/宏保留維度。sizeof(struct) 包含填充位元組,offsetof 配合使用分析佈局。sizeof(int[n]) 在運行期計算,但 C11 為可選特性,可移植性代碼避免依賴。任何語法疑問,ISO C 標準文檔 (N1570 / N2176 等) 是唯一權威解釋源。養成查閱標準習慣,比搜尋博客更可靠、更專業。