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

C 語言 sizeof 深度解析:關鍵字而非函數的編譯期特性

     編輯:關於C

sizeof 是函數還是關鍵字?

乍看 sizeof(int)、sizeof(x) 總帶括號,極易誤認為函數呼叫。實則 sizeof 是 C 語言 32 個關鍵字之一,在編譯期由編譯器根據型別直接計算位元組大小,不產生任何執行期指令。

括號的規則與陷阱

  • 變數/表達式:可省略括號,如 sizeof x、sizeof arr[999999]。
  • 型別名稱:必須加括號,如 sizeof(int),否則編譯錯誤 expected primary-expression before "int"。
  • 建議統一加括號,提升可讀性並避免誤解。

編譯期計算的鐵證

int arr[10];
printf("%zu\n", sizeof arr[999999999]);  // 輸出 4,不會存取越界記憶體
printf("%zu\n", sizeof(printf("hactrox"))); // 輸出 4,"hactrox" 並未被列印

第一例證明 sizeof 僅依據 arr[索引] 的型別(int)決定大小,完全不評估索引運算式。
第二例證明 sizeof 不會實際呼叫函數,而是直接取函數回傳型別(printf 回傳 int)的大小。

經典陷阱:有號與無號比較

#define SIZE_OF_ARRAY (sizeof(array) / sizeof(array[0]))
int array[] = {1,2,3,4,5};
for (int d = -1; d < (SIZE_OF_ARRAY - 1); d++)  // 無限迴圈!
    printf("%d\n", array[d+1]);

sizeof 回傳 size_t(無號),d 為 int(有號)。比較時 d 隱式轉為無號,-1 變成巨大正數,導致條件永真。
解法:將索引改為 size_t,或在比較前強制轉型 (int)SIZE_OF_ARRAY。

快速取得整型最大值

printf("Max unsigned int: %u\n", ~(unsigned int)0);
printf("Max signed int:   %d\n", ~(unsigned int)0 >> 1);

利用位元補數特性,無需查閱 limits.h 即可獲得極值。

總結

  1. sizeof 是關鍵字,編譯期決議,零執行期開銷。
  2. 型別必加括號,變數可不加;統一加括號最保險。
  3. 回傳 size_t,參與比較/運算時注意有號/無號隱式轉換。
  4. 善用 sizeof 計算陣列元素個數、結構體大小,避免硬編碼魔術數字。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved