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

C語言 sizeof 關鍵字深度解析:編譯期計算與類型轉換陷阱

     編輯:關於C語言

C語言 sizeof 關鍵字深度解析:編譯期計算與類型轉換陷阱

sizeof 是 C 語言 32 個關鍵字之一,而非函數。本文揭示其編譯期求值本質、括號使用規則、與無符號數比較的隱式轉換陷阱,並分享獲取整型最大值技巧。

sizeof 不是函數的鐵證

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 結果直接比較
  • 位運算技巧可快速獲取類型最大值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved