sizeof 是 C 語言 32 個關鍵字之一,而非函數。本文揭示其編譯期求值本質、括號使用規則、與無符號數比較的隱式轉換陷阱,並分享獲取整型最大值技巧。
int num = 5; sizeof(num); // 合法,輸出 4 sizeof num; // 合法!無括號也能用於變量 sizeof int; // 錯誤!類型必須加括號:sizeof(int)
sizeof 變量 可省略括號,sizeof(類型) 必須加括號。建議統一加括號,提高可讀性並避免歧義。
sizeof 在編譯期根據類型確定大小,**不執行**括號內表達式:
int cc[10];
sizeof cc[999999999]; // 輸出 4,不會訪問越界內存
sizeof(printf("hactrox")); // 輸出 4,不打印字符串!printf 返回 int
經典驗證:
int fun() { printf("hactrox"); return 5; }
sizeof(fun()); // 輸出 4,fun() 未被調用
#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(無符號),SIZE_OF_ARRAY-1 為無符號數。d(-1)隱式轉換為巨大無符號數,條件 d < ... 為假。
修正:強制轉換或避免負數索引:for(size_t d = 0; d < SIZE_OF_ARRAY; d++)
int a = -1;
unsigned int b = 10000;
if(a > b) printf("a > b\n"); // 輸出此行!-1 轉為 UINT_MAX
printf("%u\n", (unsigned int)a); // 輸出 4294967295
// 無符號 int 最大值:所有位置 1
printf("%u\n", ~(unsigned int)0); // 4294967295
// 有符號 int 最大值:最高位 0,其餘 1
printf("%d\n", ~(unsigned int)0 >> 1); // 2147483647
原理:~0 全位取反為全 1,右移 1 位清除符號位。
sizeof 是關鍵字,編譯期計算,不求值sizeof 返回無符號類型,參與比較會觸發隱式轉換sizeof 結果直接比較