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

sizeof 深度解析:關鍵字、運算符與「非函數」的三重身份

     編輯:關於C語言

sizeof 的三重身份真相

在 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) 類函數調用語法。三大鐵證打破幻覺:

  1. 無需括號的運算式形式:int i; sizeof i; 合法編譯並運行。若為函數,參數必須加括號。
  2. 編譯期計算:sizeof 結果在編譯期確定 (VLA 除外),無運行期函數調用開銷。sizeof(foo()) 不會調用 foo(),僅推導其返回類型大小。
  3. 不參與隱式轉換: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 配合使用分析佈局。
  • VLA (Variable Length Array):C99 支援 sizeof(int[n]) 在運行期計算,但 C11 為可選特性,可移植性代碼避免依賴。

標準文檔:終極裁判

任何語法疑問,ISO C 標準文檔 (N1570 / N2176 等) 是唯一權威解釋源。養成查閱標準習慣,比搜尋博客更可靠、更專業。

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