三大括號核心功能對比
| 符號 | 名稱 | 核心用途 | 關鍵規則 |
{ } | 大括號 / 花括號 | 複合語句 / 區塊、結構體/聯合/列舉定義、初始化列表 | 定義作用域;變數生命週期限於區塊內;if/for/while 單句可省略,多句必加 |
( ) | 小括號 / 圓括號 | 運算式分組/優先級覆蓋、函數聲明/定義/調用參數列表、if/while/switch 條件、類型轉換、sizeof 類型操作數 | 改變運算優先順序;函數調用必須加 () 即使無參數 |
[ ] | 中括號 / 方括號 | 陣列下標存取、陣列宣告大小、可變長度陣列 (VLA)、屬性標記 (C23 [[attr]]) | arr[i] 等價於 *(arr+i);下標從 0 起;宣告時必須是常數表達式 (VLA 除外) |
詳細使用場景與範例
1. 大括號 { } —— 作用域與初始化
// 1.1 複合語句 (控制流程主體)
if (x > 0) {
int y = x * 2; // y 僅在此區塊可見
printf("%d\n", y);
} // y 此處銷毀
// 1.2 函數體
int add(int a, int b) { return a + b; }
// 1.3 結構體/聯合/列舉定義
struct Point { int x; int y; }; // 結尾需分號
// 1.4 初始化列表 (C99 指定初始化器)
int arr[5] = { [0] = 10, [4] = 20 }; // 其餘為 0
struct Point p = { .x = 1, .y = 2 };
2. 小括號 ( ) —— 分組與函數
// 2.1 運算優先級覆蓋
int a = (2 + 3) * 4; // 20,非 2 + 12 = 14
// 2.2 函數聲明/定義/調用
void func(void); // 宣告
void func(void) { } // 定義
func(); // 調用 (必須有括號)
// 2.3 條件判斷
if (a > 0 && (b < 10 || c == 0)) { ... }
// 2.4 強制類型轉換
double d = 3.14;
int i = (int)d; // 截斷為 3
// 2.5 sizeof 類型操作數 (必須加括號)
size_t s = sizeof(int); // sizeof 變數可不加括號:sizeof d
3. 中括號 [ ] —— 陣列與指標運算
// 3.1 陣列宣告
int scores[100]; // 固定大小
int n = 10;
int vla[n]; // C99 VLA (運行時決定大小,棧上分配)
// 3.2 下標存取 (指標算術語法糖)
scores[0] = 100; // *(scores + 0)
int *p = scores;
p[5] = 90; // *(p + 5) 合法
// 3.3 多維陣列
int matrix[3][4];
matrix[1][2] = 5; // *(*(matrix + 1) + 2)
易混淆陷阱
- 函數指標聲明:
int (*fp)(int, int); — *fp 被 () 包圍,表示 fp 是指標,指向函數。少括號 int *fp(int, int); 變成函數宣告 (回傳 int*)。
- 巨集參數括號:
#define SQUARE(x) ((x)*(x)) — 參數與整體必須加括號,防 SQUARE(a+b) 展開錯誤。
- 複合字面量 (C99):
(int[]){1,2,3} — 類型名用 () 包圍,初始化用 {},建立臨時陣列。
總結口訣
- 大括號:圈地自萌 (作用域)、建房子 (結構體)、裝箱子 (初始化)。
- 小括號:改優先級、傳參數、叫函數、轉類型、問大小。
- 中括號:取元素、定長度、指標算術寫得爽。