運算符與表達式是 C 語言程式設計的基石。本文系統梳理運算符分類、優先級規則、類型轉換機制,並透過實例揭示前後綴自增、複合賦值、隱式轉換等易錯細節。
| 類別 | 運算符 | 說明 |
|---|---|---|
| 算術 | + - * / % | 基本數學運算 |
| 關係 | > < == != >= <= | 比較運算,結果為 0/1 |
| 邏輯 | && || ! | 短路求值特性 |
| 位操作 | & | ^ ~ << >> | 按位運算,適用整數型別 |
| 賦值 | = += -= *= /= %= &= ^= |= <<= >>= | 右結合性,優先級極低 |
| 條件 | ?: | 三目運算符,唯一三元運算符 |
| 逗號 | , | 順序求值,取最後表達式值 |
| 指標 | * & | 解引用與取址 |
| sizeof | sizeof | 編譯期計算型別/變數大小 |
| 特殊 | () [] -> . | 函數調用、陣列下標、結構體成員存取 |
黃金法則:括號最高優先級;不確定時加括號。連續單目運算符(如 a+++b)務必用空格分隔(a++ + b 或 a + ++b)。
(型別名) 運算式 // 方式 1
(型別名)(運算式) // 方式 2,推薦:避免運算子優先級干擾
// 例:浮點轉整數
float x = 2.5, y = 4.8;
int m = (int)(x + y); // m = 7,先加後截斷
int n = (int)x + m/3; // n = 2 + 2 = 4
注意:強制轉換不改變原變數型別,僅臨時用於運算。
規則:低精度向高精度轉換
char、short → int(整數提升)float → double| 形式 | 語法 | 運作順序 | 表達式值 |
|---|---|---|---|
| 前綴自增 | ++a | 先增後用 | 增後的值 |
| 後綴自增 | a++ | 先用後增 | 增前的值 |
| 前綴自減 | --a | 先減後用 | 減後的值 |
| 後綴自減 | a-- | 先用後減 | 減前的值 |
int i=6, j=6, k=6, h=6;
int m = i++; // m=6, i=7
int n = ++j; // n=7, j=7
int x = k--; // x=6, k=5
int y = --h; // y=5, h=5
x *= 3 + 2; // 等價 x = x * (3+2),優先級低於算術運算
x *= y = z = 4; // 右結合:z=4 → y=4 → x=x*4
z = x++ - 1; // z = x-1 後 x++
z = x++ * ++y; // y++ → z=x*y → x++
int a, b = 322;
float x, y = 8.88;
char c1 = 'k', c2;
a = y; // float→int,截斷小數,a=8
x = b; // int→float,x=322.0
a = c1; // char→int,ASCII 值,a=107
c2 = b; // int→char,截取低 8 位,c2=66 ('B')
5/2=2。需 5.0/2 或 (float)5/2a = b++ + ++b 行為未定義,嚴禁單語句多次修改同一變數-1 > 0U 為真(-1 轉為大無符號數)0.1 + 0.2 != 0.3,比較需用 epsilon熟練掌握運算符優先級、類型轉換規則與副作用陷阱,是寫出正確、高效、可維護 C 代碼的前提。