運算符與表達式是 C 語言程式設計的基石。熟練掌握它們的分類、優先順序與類型轉換規則,能讓你寫出更高效、更安全的程式碼。本文系統整理了 C 語言的運算符體系,並透過實例深入剖析隱含與強制類型轉換、算術運算細節以及賦值運算的陷阱。
C 語言提供了豐富的運算符,按功能可分為以下九大類:
+、-、*、/、%,支援基本數學運算。>、<、==、!=、>=、<=,用於條件判斷,結果為 0 或 1。&&(邏輯與)、||(邏輯或)、!(邏輯非),具備短路求值特性。&、|、^、~、<<、>>,直接操作二進制位,常用於底層優化。=、+=、-=、*= 等,結合運算與賦值,右結合性。? :,唯一的三目運算符,形成 expr1 ? expr2 : expr3。,,將多個表達式串聯,整體值為最後一個表達式的值。*(間接引用)、&(取址),是指標操作的核心。sizeof(計算類型/變數佔用位元組)、()(函式呼叫/強制轉型/優先級提升)、[](陣列索引)、->、.(結構體成員存取)。記住核心順序口訣:「單目 > 算術 > 移位 > 關係 > 相等 > 位與 > 位異或 > 位或 > 邏輯與 > 邏輯或 > 條件 > 賦值 > 逗號」。
() [] -> .)優先級最高,左結合。++ -- + - ! ~ * & sizeof、強制轉型)優先級次之,右結合。() 可強制改變順序,建議複雜表達式多加括號提升可讀性。a+++b 應寫作 a++ + b 或 a + ++b,利用空格明確意圖。語法形式:(型別名) 表達式 或 (型別名)(表達式)。注意:轉換只影響當次運算的結果,不改變原變數的型別與數值。
#include <stdio.h>
int main(void) {
float x = 2.5f, y = 4.8f;
int m, n;
m = (int)(x + y); // 7.3 → 7
n = (int)x + m / 3; // 2 + 7/3 → 2 + 2 = 4
m = n % 4; // 4 % 4 = 0
x = x + y; // x 變為 7.3
printf("m=%d, n=%d, x=%.2f, y=%.2f\n", m, n, x, y);
return 0;
}
不同型別混合運算時,編譯器自動按「低向高」轉換:
char、short → int(整數提升)。long double > double > float > unsigned long long > long long > unsigned long > long > unsigned int > int 方向提升。例:int + float → float;unsigned int + int → unsigned int(可能導致負數變大數,需謹慎)。
+ - * / % 五大運算符。整數除法截斷向零,% 僅適用於整數,滿足 (a/b)*b + a%b == a。
| 形式 | 操作順序 | 表達式值 |
|---|---|---|
++i / --i | 先增/減,後取值 | 新值 |
i++ / i-- | 先取值,後增/減 | 舊值 |
單獨語句中無差異,但嵌入表達式時影響巨大:
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
a = b = c = 1 等價 a = (b = (c = 1))。op= 形式(+= -= *= /= %= &= |= ^= <<= >>=),x op= y 等價 x = x op (y),但 x 只求值一次(對有副作用的表達式如 a[i++] += 1 有差異)。
int x = 2, y, z;
x *= 3 + 2; // x = 2 * (3+2) = 10
x *= y = z = 4; // y=4, z=4, x = 10 * 4 = 40
x = y = 1; // x=1, y=1
z = x++ - 1; // z = 1 - 1 = 0, x 變 2
z = x++ * ++y; // y=2, z = 2 * 2 = 4, x 變 3
賦值號兩側型別不同時,右值隱含轉換為左值型別:
int 32 位超過 float 尾數 23 位)。int a, b = 322;
float x, y = 8.88f;
char c1 = 'k', c2; // 'k' = 107
a = y; // a = 8
x = b; // x = 322.0
a = c1; // a = 107
c2 = b; // c2 = 322 % 256 = 66 ('B')
運算符優先級、類型轉換規則、自增自減副作用、賦值右結合特性是 C 語言新手最易踩坑的地方。建議:
下一篇將深入關係、邏輯、位運算與條件運算符的實戰技巧。