運算子是程式設計的基礎構建塊。C 語言提供豐富的運算子類別,掌握其優先序、結合性與細微行為差異,能寫出高效、無錯誤的程式碼。本文系統整理四大核心運算子類別,並透過實例深度解析易混淆重點。
int, if, while, sizeof 等),不可作變數名使用。| 類別 | 運算子 | 說明 |
|---|---|---|
| 算術 | + - * / % ++ -- | 基本數學運算、自增減 |
| 關係 | > < == >= <= != | 比較大小,結果為 0 或 1 |
| 邏輯 | ! && || | 布林邏輯運算,具短路特性 |
| 位元 | << >> ~ | ^ & | 位元層級操作 |
| 特殊 | = ? : , * & sizeof (type) . -> [] () | 賦值、三元、逗號、指標、型別轉換等 |
+= -= *= /= %= <<= >>= &= ^= |=
x += 1 等價於 x = x + 1,但 x 僅評估一次,對複雜運算式(如 arr[foo()] += 1)效率更高且避免副作用重複執行。
| 形式 | 運算式值 | 變數最終值 |
|---|---|---|
++n (前綴) | 自增後的值 | n+1 |
n++ (後綴) | 自增前的值 | n+1 |
int X = 5, Y, Z;
Y = X++ + 5; // Y = 5 + 5 = 10, X 變 6
Z = ++X + 5; // X 先變 7, Z = 7 + 5 = 12
// 結果:Y=10, X=7, Z=12
逗號有兩種用途:分隔符(如變數宣告)與運算子。
int a = 2*6, a-4, a+15; // a = 12 (僅第一項賦值給 a)
int a;
a = 3*5, a*4, a+5; // a = 15
printf("%d", a); // 輸出 15
int a=2, b=4, c=6, x, y;
y = 3*5, y = ((x=a+b), y=0, y=(b+c));
// 步驟:x=6, y=0, y=10, 最後 y=10
// 結果:y=10, x=6
// 輸入 3 和 5
3 = 0011
5 = 0101
3|5 = 0111 = 7
// 輸入 1 和 7
1 = 0001
7 = 0111
1^7 = 0110 = 6
應用場景:旗標操作、權限遮罩、高效乘除 2 的冪次(位移)、校驗碼計算。
? :test ? expression1 : expression2
可替代簡單的 if-else,常用於初始化、回傳值、宏定義中。
// JavaScript 風格範例 (C 中無 Date 物件,邏輯相同)
var now = new Date();
var greeting = "Good" + ((now.getHours() > 17) ? " evening." : " day.");
// 等價 if-else
if (now.getHours() > 17) greeting += " evening.";
else greeting += " day.";
() [] -> . (後綴/結構成員)++ -- ! ~ (type) * & sizeof (一元,右結合)* / % (左結合)+ - (左結合)<< >> (左結合)< <= > >= (左結合)== != (左結合)& (位元 AND,左結合)^ (位元 XOR,左結合)| (位元 OR,左結合)&& (邏輯 AND,左結合)|| (邏輯 OR,左結合)? : (右結合)= += -= ... (賦值,右結合), (逗號,左結合)最佳實務:複雜運算式務必加上括號明確分組,不要依賴記憶優先序,提升可讀性並避免隱性 Bug。