1. 前言
我們先從生活中的比喻開始。想像一下食譜:
把麵粉、雞蛋和糖混合打發,加進奶油再打發一次。
是不是怪怪的?現在想像一下,如果「打發」和「加進」之間有逗號或括號,步驟馬上就清楚多了。
寫程式時也會遇到類似情況,當你寫出一個複雜的表達式:
bool result = a > 0 && b < 10 || c == 3;
順序是什麼?先算 a > 0 && b < 10,再來 || c == 3?還是反過來? 如果沒有明確的運算順序,電腦就會「搞錯材料」,結果會讓你傻眼。
2. C# 的運算子優先順序
C#(跟大多數程式語言一樣)有一張運算子優先順序表。
優先順序高的運算子會比低的先執行。
來看看這張表最重要的部分 (針對條件式):
| 運算子 | 說明 | 優先順序 |
|---|---|---|
| () | 括號 | 最高 |
| ! | 邏輯「非」 | 高 |
| ==, != | 等於 / 不等於 | 中 |
| <, >, <=, >= | 比較 | 中 |
| && | 邏輯「AND」 | 較低 |
| || | 邏輯「OR」 | 更低 |
(還有算術運算子 — 它們的優先順序比邏輯運算子高。)
最重要的規則
「AND」(&&) 的優先順序比「OR」(||) 高,
也就是說會先算「AND」,再算「OR」。
條件優先順序的流程圖
會先算
a > 0 && b < 10,然後結果再跟
c == 3 用
|| 比較
實際上:a > 0 && b < 10 || c == 3 — 會先算 a > 0 && b < 10,然後結果再跟 c == 3 用 || 比較。
3. 運算子的方向:從左到右還是反過來
除了優先順序,還有一個詞:結合性。
這是指如果運算子「排在一起」而且優先順序一樣,會從哪個方向開始算。
例子:
bool a = true, b = false, c = true;
bool result = a && b && c;
問題:怎麼算?
答案:&& 的結合性是 從左到右。
所以會先算 a && b,然後再跟 c 算。
針對條件來說:
| 運算子 | 結合性 |
|---|---|
| &&, || | 從左到右 |
| ! | 從右到左 |
4. 括號 — 複雜條件裡的好朋友
這裡就是魔法(也是救星)開始的地方。當你寫表達式時,括號 會改變優先順序,讓你的 code 更清楚也更安全。
例子 1(沒括號):
// 我們想要:「如果使用者是成年人而且是公民,或是他有特別通行證」
bool isAdult = age >= 18;
bool isCitizen = country == "白俄羅斯";
bool hasPermit = hasSpecialPass == true;
if (isAdult && isCitizen || hasPermit)
{
Console.WriteLine("允許進入!");
}
C# 怎麼算:
會先算 isAdult && isCitizen,然後結果再跟 hasPermit 用 || 比較。
- 假設 isAdult = true, isCitizen = false, hasPermit = true
isAdult && isCitizen→true && false→falsefalse || true→true
也就是說,只要有特別通行證就能進。
如果沒有通行證,但你是成年公民 — 也能進。
例子 2(有括號):
if (isAdult && (isCitizen || hasPermit))
{
Console.WriteLine("允許進入!");
}
現在程式會先檢查:
isCitizen || hasPermit,然後這個結果再跟 isAdult 一起算。
也就是你必須是成年人 而且(要嘛是公民,要嘛有特別通行證)。
括號小小一個,邏輯差很大喔!
GO TO FULL VERSION