目次
1. 前言
在 C 語言中,運算子的優先順序對正確理解程式的運作以及獲得預期結果非常重要。特別是,如果誤解了運算子的評估順序,容易產生非預期結果或程式錯誤。本文將詳細解說 C 語言主要運算子的優先順序與結合規則,並結合實例幫助您深入理解。
2. 運算子的種類與基本用法
2.1 算術運算子
算術運算子是用於數值計算的基本運算子。這些運算子在程式中經常使用,因此必須確實理解其基本用法。
+
(加法):將兩個數值相加。-
(減法):將兩個數值相減。*
(乘法):將兩個數值相乘。/
(除法):將兩個數值相除(整數相除時小數點以下會被捨去)。%
(取餘數):取得除法的餘數。
範例:
int a = 10, b = 3;
int sum = a + b; // 13
int diff = a - b; // 7
int prod = a * b; // 30
int quot = a / b; // 3
int rem = a % b; // 1
2.2 比較運算子
比較運算子用於比較兩個值,結果會回傳真(1)或假(0)。在條件判斷或迴圈中經常使用。
>
(大於):左邊的值大於右邊時為真。<
(小於):左邊的值小於右邊時為真。>=
(大於等於):左邊的值大於或等於右邊時為真。<=
(小於等於):左邊的值小於或等於右邊時為真。==
(等於):左右兩邊的值相等時為真。!=
(不等於):左右兩邊的值不相等時為真。
int a = 5, b = 10;
if (a < b) {
printf("a 比 b 小\n"); // 會顯示
}

3. 運算子的優先順序與結合規則
3.1 運算子的優先順序
運算子的優先順序決定了在包含多個運算子的運算式中,哪個運算子會先被計算。以下是部分 C 語言運算子的優先順序列表,由高至低排列。
優先順序 | 運算子 | 說明 |
---|---|---|
1 | () [] -> . | 函數呼叫、陣列存取、指標成員 |
2 | ++ -- | 後置遞增、遞減 |
3 | ++ -- | 前置遞增、遞減、正負號運算 |
4 | * / % | 乘法、除法、取餘數 |
5 | + - | 加法、減法 |
6 | << >> | 位元移位 |
7 | < <= > >= | 比較運算子 |
8 | == != | 等於、不等於 |
9 | & | 位元 AND |
10 | ^ | 位元 XOR |
11 | | | 位元 OR |
12 | && | 邏輯 AND |
13 | || | 邏輯 OR |
14 | ? : | 條件運算子 |
15 | = += -= | 指定、複合指定 |
16 | , | 逗號運算子 |
3.2 結合規則
結合規則決定當同一優先順序的運算子出現多次時,運算式會從哪一側開始計算。大多數運算子是左結合,但有些(如指定運算子、條件運算子)是右結合。
- 左結合:如
*
、+
、-
等運算子從左到右計算。 - 右結合:指定運算子與條件運算子
? :
則從右到左計算。
int a = 5, b = 10, c = 15;
int result = a - b + c; // 左結合 (a - b) + c = 0
4. 特定運算子的優先順序注意事項
4.1 邏輯運算子
邏輯 AND(&&
)和邏輯 OR(||
)常用於結合條件式,&&
的優先順序高於 ||
,因此在如下程式碼中需要特別留意。
int a = 1, b = 0, c = 1;
if (a && b || c) {
printf("Truen"); // 會顯示
}
此例中,a && b
會先被計算,然後結果再與 c
做邏輯 OR(||
)運算。若要明確指定計算順序,建議使用括號。
if ((a && b) || c) {
// 更清楚的計算順序
}
4.2 位元運算子
位元運算子(&
、|
、^
)用於位元操作,但其優先順序低於算術運算子與比較運算子,遇到複雜運算式時須特別留意。
int x = 5; // 0101
int y = 3; // 0011
int result = x & y; // 0001(位元 AND)
5. 實際程式範例
以下介紹一個容易誤解運算子優先順序的程式範例。此例中 ||
與 &&
的計算順序容易被混淆。
#include <stdio.h>
int main() {
int a = 0, b = 1;
if (a == 0 || a == 1 && b == 0) {
printf("Truen"); // 會顯示
}
return 0;
}
在這個例子中,a == 1 && b == 0
會先被計算,但可能導致非預期結果。若要獲得正確結果,建議使用括號明確指定計算順序。
if ((a == 0 || a == 1) && b == 0) {
printf("Truen");
}
6. 結論
C 語言中運算子的優先順序對程式正確執行至關重要。處理複雜運算式時,理解優先順序與結合規則,並適當使用括號明確指定順序,有助於避免非預期的錯誤。只要多加留意運算子的優先順序,就能寫出更安全、更高效的程式碼。