| 類別 | 形式 | 示例 | 作用 |
|---|---|---|---|
| 控制語句 | if/switch/for/while/do-while/goto/break/continue/return | `if(x>0) foo();` | 改變執行流程 |
| 函數調用語句 | 函數調用 + `;` | `printf("hi");` | 執行子程序 |
| 表達式語句 | 表達式 + `;` | `a = b + c;` | 計算/賦值/副作用 |
| 空語句 | `;` | `while(getchar()!='\n');` | 佔位/循環體為空 |
| 復合語句 | `{ 声明/語句列表 }` | 函數體、if 分支塊 | 構建塊級作用域 |
// 單分支
if (expr) stmt;
// 雙分支
if (expr) stmt1; else stmt2;
// 多重分支(級聯)
if (e1) s1; else if (e2) s2; else s3;
// 三元運算符(表達式級)
max = (a>b) ? a : b;
// switch-case(整型常量標籤)
switch (expr) {
case 1: s1; break;
case 2: s2; break;
default: sd;
}
break 易漏導致貫穿;`default` 可選但建議保留。
| 類型 | 語法 | 語義 | 典型場景 |
|---|---|---|---|
| for | `for(init; cond; inc) body` | 先判斷,知次數 | 遍歷數組、固定次數 |
| while | `while(cond) body` | 先判斷,可零次 | 條件驅動、讀文件/EOF |
| do-while | `do body while(cond);` | 後判斷,至少一次 | 菜單交互、至少一次處理 |
嵌套循環:外層控制行/輪次,內層控制列/細節。`break` 只跳出當層,`goto` 或標誌變量可跳多層。
int a[10] = {1,2,3}; // 部分初始化,餘補 0
int b[] = {1,2,3,4,5}; // 自動推導長度 5
// 訪問:a[i] ≡ *(a+i)
// 遍歷:for(i=0;i<10;i++) 或 指針法 for(p=a;p
int m[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
// 初始化可扁平:int m[3][4] = {1,2,...,12};
// 內存連續,行主序:m[i][j] 偏移 = (i*4+j)*sizeof(int)
返回類型 函數名(參數列表) {
// 聲明部分
// 語句部分
return 值; // 無返回值用 void,可省略 return
}
// 头文件 add.h
int add(int a, int b); // 聲明
// 源文件 add.c
int add(int a, int b) { return a+b; } // 定義
// main.c
#include "add.h"
int main() { printf("%d", add(1,2)); }
調用前必須見到聲明(隱式聲明 C99 廢除)。
| 關鍵字 | 適用對象 | 生命周期 | 作用域 | 鏈接性 | 默認初值 |
|---|---|---|---|---|---|
auto | 局部變量 | 塊執行期 | 塊 | 無 | 不定值 |
register | 局部變量 | 塊執行期 | 塊 | 無 | 不定值 |
static | 局部/全局 | 程序全期 | 塊/文件 | 無/內部 | 0 |
extern | 全局變量/函數 | 程序全期 | 文件/跨文件 | 外部 | 0 |
代碼區:函數機器碼
常量區:字面量 "abc"、const 全局
靜態/全局區:全局、static 變量
堆區:malloc/free/new/delete
棧區:auto/register 變量、函數幀、參數、返回地址
| 類型 | 關鍵字 | 可見範圍 | 用途 |
|---|---|---|---|
| 內部函數 | `static` | 本文件(內部鏈接) | 隱藏實現細節,避免符號衝突 |
| 外部函數 | `extern` (默認) | 整個程序(外部鏈接) | 跨文件調用,庫 API |
// a.c
static void helper(void) { ... } // 僅 a.c 可見
void api(void) { helper(); } // 導出接口
// b.c
extern void api(void); // 聲明使用
// helper 不可見
// stack.h (接口)
#ifndef STACK_H
#define STACK_H
typedef struct Stack Stack;
Stack *stack_create(void);
void stack_push(Stack *, int);
int stack_pop(Stack *);
void stack_destroy(Stack *);
#endif
// stack.c (實現)
#include "stack.h"
#include
struct Node { int val; struct Node *next; };
struct Stack { struct Node *top; };
// ... 實現細節隱藏,僅導出接口函數
// main.c (使用)
#include "stack.h"
#include
int main() {
Stack *s = stack_create();
stack_push(s, 42);
printf("%d\n", stack_pop(s));
stack_destroy(s);
}
C 程序 = 語句塊 + 函數 + 數據對象。掌握控制流、數組/指針/字符串、函數接口與實現分離、作用域鏈接存儲模型、內部/外部函數封裝,即掌握了 C 語言工程化構建的骨架。現代 C 開發:模塊化(.h/.c 分離)、靜態內部函數隱藏實現、const 正確性、錯誤碼/斷言防禦性編程。