C語言常量與變量全解析:字面量、標識符、存儲、ASCII碼表
常量與變量是程序操作數據的兩大基石。本文系統梳理常量分類(整型、實型、符號、字符/字符串)、C標識符規則、變量三要素(名、類型、值)、整型/實型/字符型變量細節、溢出與誤差、ASCII碼表。
一、常量
1. 整型常量
| 進制 | 前綴 | 數字組成 | 示例 |
| 十進制 | 無 | 0-9,首位非0 | 123, -456 |
| 八進制 | 0 | 0-7 | 0173 (十進制123) |
| 十六進制 | 0x/0X | 0-9, a-f/A-F | 0x7B (十進制123) |
- 後綴:
L/l (long),U/u (unsigned),LL/ll (long long)。
- 無符號常量參與運算觸發隱式轉換陷阱(如
-1U > 0 為真)。
2. 實型常量 (浮點常量)
- 十進制小數形式:
3.14, .5, 10.(必須有小數點)。
- 指數形式:
1.2e3 (1200), 5E-2 (0.05)。e/E 前必有數字,後必為整數。
- 默認類型為
double。後綴 f/F 指定 float,l/L 指定 long double。
3. 符號常量
#define PI 3.1415926
#define MAX_SIZE 1024
#define GREETING "Hello"
- 預處理階段文本替換,**無類型、無作用域、不佔內存**。
- 慣例:全大寫命名,與變量區分。
- 優於
const 的編譯期常量表達式場景(如數組長度、switch case、位域寬度)。
4. 字符型常量
| 類型 | 語法 | 存儲 | 示例 |
| 字符常量 | 單引號 'a' | 1字節,ASCII碼值 | 'A' (65), '\n' (10) |
| 字符串常量 | 雙引號 "abc" | 字符數組+\0結尾,存常量區 | "A" 佔2字節('A','\0') |
轉義字符
| 轉義 | 含義 | ASCII |
\n | 換行 | 10 |
\t | 水平製表 | 9 |
\\ | 反斜線 | 92 |
\' | 單引號 | 39 |
\" | 雙引號 | 34 |
\0 | 空字符(字符串結束) | 0 |
\xHH | 十六進制ASCII | \x41='A' |
\OOO | 八進制ASCII | \101='A' |
二、C語言標識符
- 組成:字母(A-Z,a-z)、數字(0-9)、下劃線
_。
- 首字符**不能是數字**。
- **區分大小寫**。
- 不能使用關鍵字(
if, for, while, int, return...)。
- 長度:C89限31字符(外部)/63字符(內部);C99+通常無實際限制(編譯器實現定義)。
- 命名規範:見名知意(
length, sum, pi, user_count),變量小寫,符號常量大寫,宏常全大寫。
- 三類:關鍵字、預定義標識符(
printf, malloc, errno...)、用戶自定義標識符。
三、變量
變量具備三要素:**名、類型、值**。遵循「先定義後使用」。
1. 變量類型與存儲
整型變量
| 類型 | 說明 | 典型大小 | 範圍(有符號) |
short/short int | 短整型 | 2字節 | -32,768 ~ 32,767 |
int/signed int | 基本整型 | 4字節(32/64位) | -2,147,483,648 ~ 2,147,483,647 |
long/long int | 長整型 | 4/8字節 | 同int或更大 |
long long | 長長整型 | 8字節 | -9e18 ~ 9e18 |
- 內存中以**補碼**二進制存儲。
- 溢出:有符號溢出是未定義行為;無符號溢出模2N環繞。
實型變量
| 類型 | 大小 | 範圍 | 有效位數 | 格式 |
float | 4字節 | ±3.4e38 | 6~7 | %f/%e/%g |
double | 8字節 | ±1.7e308 | 15~16 | %lf/%le/%lg |
long double | 10/16字節 | ±1.1e4932 | 18~19 | %Lf/%Le/%Lg |
- 存儲:IEEE 754 格式(符號位+指數位+尾數位)。
- 捨入誤差:
0.1 無法精確表示,**絕不直接用 == 比較**,用 fabs(a-b) < EPS。
printf 傳遞 float 自動提升為 double,%f 通用;scanf 必須區分 %f(float*) / %lf(double*)。
字符型變量
| 類型 | 大小 | 範圍 |
signed char | 1字節 | -128 ~ 127 |
unsigned char | 1字節 | 0 ~ 255 |
char | 1字節 | 實現定義有符號/無符號 |
char 用於存字符時用 %c,作為小整數用 %d/%hhd。
- 字符字面量
'a' 類型為 int (C語言歷史遺留),賦值給 char 隱式截斷。
2. 變量賦值與初始化
- 賦值語句:
a = 10;
- 初始化:
int a = 10; (定義時賦值)。
- 輸入:
scanf("%d", &a);。
- 未初始化局部變量值不定(棧垃圾),全局/靜態變量默認0。
四、附錄:ASCII碼表(關鍵部分)
| 十進制 | 十六進制 | 字符 | 說明 |
| 0 | 0x00 | NUL | 空字符/字符串結束 |
| 9 | 0x09 | HT | 水平製表 \t |
| 10 | 0x0A | LF | 換行 \n |
| 13 | 0x0D | CR | 回車 \r |
| 32 | 0x20 | SP | 空格 |
| 48-57 | 0x30-0x39 | 0-9 | 數字字符 |
| 65-90 | 0x41-0x5A | A-Z | 大寫字母 |
| 97-122 | 0x61-0x7A | a-z | 小寫字母 |
| 127 | 0x7F | DEL | 刪除 |
五、關鍵總結
- 常量是值,變量是存儲值的盒子(有地址、類型、名字)。
#define 是預處理替換,const 是只讀變量(有類型、作用域、地址)。
- 整型補碼、浮點IEEE 754、字符ASCII — 理解底層位模式是避坑關鍵。
sizeof 在編譯期計算類型/表達式大小,**不計算變量值**。
- 標識符命名:有意義、規範風格、避開保留字(雙下劃線開頭、下劃線+大寫開頭保留給實現)。
常量與變量看似基礎,實則蘊含C語言類型系統、存儲模型、預處理機制的核心邏輯。徹底搞清它們的「是什麼、怎麼存、怎麼用、易犯錯」,是寫出正確、可移植、無Bug C代碼的基石。
- 上一篇文章: 線程標識符獲取與打印:pthread_self 與 pthread_create 返回值對比
- 下一篇文章: scanf 深度解析:參數傳遞機制、輸入掃描流程、返回值應用
Copyright ©
程式碼之家 All Rights Reserved