承接上一篇「Hello C」,本文深入剖析 C 語言的常量、變量聲明定義區別、基本資料類型在 32 位系統上的佈局、隱式/顯式轉換規則、溢位行為、字元編碼與字串結構,配合可編譯運行的範例代碼。
extern int x;)int x = 100;)| 形式 | 語法 | 特點 | 範例 |
|---|---|---|---|
| 字面常量 | 直接書寫 | 類型由字面值推導 | 100, 3.14, 'A', "str" |
| 宏常量 | #define NAME value | 預處理器文本替換,無類型、無作用域、不分配記憶體 | #define PI 3.14 |
| const 常量 | const type name = value; | 有類型、有作用域、分配記憶體(只讀區),編譯期可優化 | const int MAX = 100; |
關鍵差異:#define X 1+2 在 3*X*4 中展開為 3*1+2*4=11;const int X=1+2 則為 3*3*4=36。宏每次引用重新展開,const 僅定義時求值一次。
| 類型 | 大小 | 範圍/精度 | 字面值後綴 |
|---|---|---|---|
| int | 4 bytes | -2,147,483,648 ~ 2,147,483,647 | 無 / L (long) |
| short | 2 bytes | -32,768 ~ 32,767 | 無 |
| long | 4 bytes (Windows) / 8 bytes (Linux 64) | 同 int 或更大 | L / l |
| unsigned int | 4 bytes | 0 ~ 4,294,967,295 | U / u |
| unsigned long | 4/8 bytes | 0 ~ ULONG_MAX | UL / ul |
| float | 4 bytes | ~7 有效位數 | F / f |
| double | 8 bytes | ~15 有效位數 | 無 / F / f |
| long double | 16 bytes (x87) / 8 bytes (其他) | ~19 有效位數 | L / l |
int oct = 015; // 八進制 -> 13 int hex = 0xFFFF; // 十六進制 -> 65535 short s = 32767; // 0x7FFF s++; // 變為 -32768 (0x8000),有符號溢位:最高位變號位 // 無符號溢位:模 2^N 環繞,C 標準保證定義行為
S = M × 2^E,二進制科學記數法:
float x = 0.00314E3; // 3.14 float y = 314E-2; // 3.14
| 概念 | 本質 | 範例 |
|---|---|---|
| 字元常量 | 單引號,對應 ASCII/Unicode 碼值 | 'A' (65), '\n' (10) |
| 轉義序列 | 反斜槓開頭,單字元 | \r\n\t\b\\\'\"\0 |
| 八進制字元 | \ooo (1-3 位八進制) | \101 -> 'A' |
| 十六進制字元 | \xhh (1-2 位十六進制) | \x41 -> 'A' |
| 字串常量 | 雙引號,字元陣列 + 隱含結束符 \0 | "abc" 佔 4 bytes: 'a','b','c','\0' |