多變量聲明等價展開
int i, j, k = 0;
// 等價於
int i = 0, j = 0, k = 0; // 注意:只有 k 顯式初始化,i/j 未初始化(垃圾值)!
// 正確鏈式初始化
int i = 0, j = 0, k = 0;
const 修飾符
const int num = 20;
num = 30; // 編譯錯誤:l-value specifies const object
volatile + const 組合陷阱
volatile const int num = 20;
int *p = #
*p = 10; // 通過指針修改 const 變量
printf("%d", num); // 輸出 10
volatile 告訴編譯器:該變量可能被外部(硬件、中斷、其他線程)修改,**禁止優化掉讀寫**;
- 配合
const 表示「代碼不主動修改,但值可能變」,常用於映射硬件寄存器;
- 通過指針去修改
const 變量屬於未定義行為,但加 volatile 後編譯器不敢優化,實際上生效(僅限特定平台)。
工程建議
- 每行聲明一個變量,初始化明確;
- 只讀參數、全局常量加
const;
- 硬件寄存器、信號處理標誌、多線程共享標誌用
volatile;
- 不要嘗試通過指針修改
const 對象,行為不可移植。