理解複雜聲明的關鍵:從變量名開始,按優先級「右、左、右、左...」螺旋向外讀。
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 代碼的基石。