語法:(型態指定符) (運算式)
功能:將運算式結果暫時轉換為指定型態,不改變原變數型態定義。
(int)(x+y) ✓ 整體轉換(int)x+y ✗ 僅 x 轉換後再加 y
main() {
float f = 5.75;
printf("(int)f=%d, f=%f\n", (int)f, f);
}
// 輸出:(int)f=5, f=5.75
// f 經強制轉 int 截斷小數,但 f 本身仍為 5.75
| 類別 | 運算子 | 說明 |
|---|---|---|
| 1. 算術 | + - * / % ++ -- | 數值運算,7 種 |
| 2. 關係 | > < == >= <= != | 比較運算,6 種 |
| 3. 邏輯 | && || ! | 邏輯運算,3 種 |
| 4. 位元 | & | ~ ^ << >> | 二進制位運算,6 種 |
| 5. 指派 | = += -= *= /= %= &= |= ^= >>= <<= | 3 類共 11 種 |
| 6. 條件 | ?: | 三目運算子 |
| 7. 逗號 | , | 合併多運算式 |
| 8. 指標 | * & | 取內容、取位址 |
| 9. sizeof | sizeof | 計算型態/運算式位元組數 |
| 10. 特殊 | () [] -> . | 括號、下標、成員存取 |
C 運算子共 15 級優先級(1 最高),同優先級時依結合性決定順序:
x - y + z → (x - y) + zx = y = z → x = (y = z)核心原則:優先級高者先運算;同級者依結合性方向結合。C 獨有的結合性機制增加表達力但也提高複雜度,需熟記常用運算子屬性。
| 運算子 | 名稱 | 結合性 | 特殊規則 |
|---|---|---|---|
| + | 加法 | 右 | |
| - | 減法 | 左 | 亦可作負號(單目) |
| * | 乘法 | 左 | |
| / | 除法 | 左 | 整數除法捨去小數;含實數則結果為 double |
| % | 取餘/模運算 | 左 | 雙運算元必為整數 |
void main() {
printf("\n\n%d,%d\n", 20/7, -20/7); // 2, -2(整數除法截斷)
printf("%f,%f\n", 20.0/7, -20.0/7); // 2.857..., -2.857...(實數除法)
}
void main() {
printf("%d\n", 100 % 3); // 輸出 1(100 ÷ 3 餘 1)
}
| 形式 | 名稱 | 運作時機 | 運算式值 |
|---|---|---|---|
| ++i | 前置遞增 | 先增後用 | 增後新值 |
| --i | 前置遞減 | 先減後用 | 減後新值 |
| i++ | 後置遞增 | 先用後增 | 增前舊值 |
| i-- | 後置遞減 | 先用後減 | 減前舊值 |
int i = 8;
printf("%d\n", ++i); // 9 (先增為9再輸出)
printf("%d\n", --i); // 8 (先減為8再輸出)
printf("%d\n", i++); // 8 (先輸出8再增為9)
printf("%d\n", i--); // 9 (先輸出9再減為8)
printf("%d\n", -i++); // -8 (先取負輸出-8再增為9)
printf("%d\n", -i--); // -9 (先取負輸出-9再減為8)
int i = 5, j = 5, p, q;
p = (i++) + (i++) + (i++); // 三個 i++ 相加:5+5+5=15,i 變 8
q = (++j) + (++j) + (++j); // 三個 ++j 相加:6+7+8=21,j 變 8
// 修正:實際 q = 6+7+8 = 21,非原文 24(原文邏輯有誤)
printf("%d,%d,%d,%d", p, q, i, j); // 15,21,8,8
修正說明:原教材範例q=(++j)+(++j)+(++j)結果應為 21(6+7+8),j 終值 8。原文標示 24 為錯誤。後置版p確為 15,i 終值 8。
運算式由常數、變數、函數、運算子組合。求值嚴格遵循優先級高先低後、同級依結合性。單一常數/變數/函數亦屬運算式特例。