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

《C 專家編程》筆記第 3 章:剖析 C 語言聲明

     編輯:關於C

聲明解讀優先級法則

理解複雜聲明的關鍵:從變量名開始,按優先級「右、左、右、左...」螺旋向外讀。

經典三連問


const int * grape;      // grape 是指標,指向 const int (值不可變)
int const * grape;      // 同上,const 修飾 int
int * const grape;      // grape 是 const 指標 (指標本身不可變),指向 int

**口訣**:const 在 * 左邊修飾被指對象 (值唯讀);在 * 右邊修飾指標本身 (指標唯讀)。

位域

結構體成員可指定位寬,節省空間,常用於硬體暫存器映射、協議解析。

struct bit_field {
    unsigned int a : 1; // 佔 1 位
    unsigned int b : 4; // 佔 4 位
    unsigned int c : 8; // 佔 8 位
};
// 總共 13 位,通常編譯器對齊到 16 位 (2 Bytes) 或 32 位

注意:位域不支持取地址操作 (&),跨平台佈局順序 (高位在前/後) 依賴實現,移植性較差。

函數參數傳遞:寄存器優先

書中強烈反對「參數從右向左壓棧」的過時說法。**現代 ABI (如 x86-64 System V, ARM64) 優先使用寄存器傳遞前幾個參數 (追求速度),不足才用棧**。編譯器優化極其激進,勿假設固定棧佈局。

聯合體

  • 成員共享同一記憶體區域,大小等於最大成員大小 (對齊後)。
  • 優點:節省空間、類型雙關 解析同一位模式 (如 float 查看 int 位模式)。
  • 缺點:無類型安全,易誤用,需程序員自行管理當前有效成員。

枚舉

定義一組命名整數常量,增強可讀性。

enum sizes { small = 7, medium, large = 10, humungous };
// small=7, medium=8, large=10, humungous=11

本質是 int 常量,可隱式轉換,但建議保持類型語義。

巨集

分為無參數 (物件宏) 與有參數 (函數宏)。

  • 預處理階段單純文本替換,**無類型檢查、無作用域**。
  • 多行定義用反斜線 \ 續行。
  • 參數務必加括號:#define SQUARE(x) ((x)*(x)) 避免優先級錯誤。
  • 副作用陷阱:SQUARE(i++) 展開為 ((i++)*(i++)),i 增加兩次。

總結

第 3 章核心在於:掌握聲明解讀規則、理解位域/聯合/枚舉的工程權衡、認清宏的文本替換本質與陷阱、修正對參數傳遞機制的過時認知。這是寫出可移植、健壯 C 代碼的基石。

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