運算符優先級與結合性表
| 優先級 | 運算符 | 結合性 | 說明 |
| 1 | () [] -> . | 左→右 | 函數調用、下標、結構訪問 |
| 2 | ++ -- + - ! ~ (type) * & sizeof | 右→左 | 一元運算符 |
| 3 | * / % | 左→右 | 乘除模 |
| 4 | + - | 左→右 | 加減 |
| 5 | << >> | 左→右 | 移位 |
| 6 | < <= > >= | 左→右 | 關係 |
| 7 | == != | 左→右 | 相等 |
| 8 | & | 左→右 | 按位與 |
| 9 | ^ | 左→右 | 按位異或 |
| 10 | | | 左→右 | 按位或 |
| 11 | && | 左→右 | 邏輯與 |
| 12 | || | 左→右 | 邏輯或 |
| 13 | ?: | 右→左 | 條件 |
| 14 | = += -= *= /= %= &= ^= |= <<= >>= | 右→左 | 賦值 |
| 15 | , | 左→右 | 逗號 |
字符串與字符數組
- 字符串常量本質是以
\0 結尾的字符數組,存儲在只讀區(修改屬 UB)。
char *s = "abc" 指向常量區;char s[] = "abc" 在棧上複製一份可修改副本。
strlen 不計 \0;sizeof 計 \0。
- 函數形參
char s[] 與 char *s 等價。
scanf("%s", arr) 遇空白停止,不需 &;printf("%s", arr) 遇 \0 停止。
枚舉常量
enum boolean { NO, YES = 1 };
// 未指定值時從 0 遞增;指定值後續繼續遞增
C 程序內存佈局
高地址
|-----------|
| 棧 | 自動變量、函數幀、向下增長
|-----------|
| |
| ↑ |
| |
| ↓ |
|-----------|
| 堆 | malloc/calloc 動態分配、向上增長
|-----------|
| BSS 段 | 未初始化全局/靜態變量、內核清零
|-----------|
| 數據段 | 已初始化全局/靜態變量
|-----------|
| 正文段 | 代碼、只讀常量、只讀
|-----------|
低地址
四種存儲類別
| 類別 | 關鍵字 | 存儲期 | 作用域 | 鏈接 | 默認值 |
| 自動 | auto | 塊進入→退出 | 塊 | 無 | 不定 |
| 寄存器 | register | 塊 | 塊 | 無 | 不定 |
| 外部 | extern | 程序全程 | 文件 | 外部 | 0 |
| 靜態 | static | 程序全程 | 塊/文件 | 內部/外部 | 0 |
static 詳解
- 全局 static:限制作用域為本文件(內部鏈接),存儲位置不變。
- 局部 static:存儲位置從棧移至靜態區,生命周期延至程序結束,作用域仍為局部,保持值跨調用。
- 函數 static:內部鏈接,僅本文件可見。
const 限定符
const int *p / int const *p:指向常量的指針(底層 const),不可通過 p 修改值,p 可變。
int *const p:常量指針(頂層 const),p 不可變,可修改指向值。
const int *const p:雙重 const,指針與值均不可變。
- 數組形參
const int a[] 實為 const int *a,函數內可修改指向但不可修改元素。
sizeof、register、位移、默認返回值
sizeof:編譯期運算符,操作數可為表達式或類型名(帶括號),返回 size_t。
register:建議編譯器放入寄存器,不可取地址(&),現代編譯器多忽略此提示。
- 左移補 0;右移:無符號邏輯右移補 0,有符號算術/邏輯右移由實現定義(不可移植)。
- 函數無返回類型聲明時默認
int(C89),C99 建議顯式聲明。
標準庫函數速查
| 頭文件 | 分類 | 常用函數 |
<string.h> | 字符串 | strcpy/strncpy, strcat/strncat, strcmp/strncmp, strlen, strchr, strrchr |
<ctype.h> | 字符測試/轉換 | isalpha, isdigit, isspace, toupper, tolower |
<math.h> | 數學 | sin, cos, sqrt, pow, log, exp, fabs |
<stdlib.h> | 隨機/存儲 | rand/srand, malloc/calloc/free |
隨機數:#define frand() ((double)rand() / (RAND_MAX + 1.0)) 生成 [0,1) 浮點數。
內存管理:malloc 不初始化,calloc 清零;釋放鏈表節點時需先保存 next 指針。