🔀 控制流程
📌 什麼是控制流程?
程式預設是從上到下一行一行執行。控制流程讓你可以:
- 做選擇(如果...就...否則...)
- 重複執行(迴圈)
- 跳過或中斷(break、continue)
📌 if / else if / else 條件判斷
int score = 85; // 學生的成績
// if 是最基本的條件判斷
if (score >= 90) // 如果成績大於等於 90
{
Console.WriteLine("優秀!"); // 印出「優秀!」
}
else if (score >= 80) // 否則如果成績大於等於 80
{
Console.WriteLine("良好!"); // 印出「良好!」
}
else if (score >= 60) // 否則如果成績大於等於 60
{
Console.WriteLine("及格"); // 印出「及格」
}
else // 以上條件都不符合時
{
Console.WriteLine("不及格"); // 印出「不及格」
}
// 輸出:良好!(因為 85 >= 80)
// 巢狀 if(if 裡面再放 if)
int age = 20; // 年齡
bool hasMoney = true; // 有沒有錢
if (age >= 18) // 先判斷是否成年
{
if (hasMoney) // 再判斷有沒有錢
{
Console.WriteLine("可以買東西"); // 成年且有錢
}
else
{
Console.WriteLine("成年但沒錢"); // 成年但沒錢
}
}
// 更簡潔的寫法:用 && 合併條件
if (age >= 18 && hasMoney) // 成年「且」有錢
{
Console.WriteLine("可以買東西");
}
📌 switch 表達式(C# 8+)
// 傳統 switch 語句
int dayNumber = 3; // 星期幾(1-7)
switch (dayNumber) // 根據 dayNumber 的值來判斷
{
case 1: // 如果是 1
Console.WriteLine("星期一"); // 印出「星期一」
break; // break 表示結束這個 case
case 2: // 如果是 2
Console.WriteLine("星期二");
break;
case 3: // 如果是 3
Console.WriteLine("星期三");
break;
case 6: // 如果是 6
case 7: // 或 7(可以合併多個 case)
Console.WriteLine("週末");
break;
default: // 以上都不是
Console.WriteLine("其他");
break;
}
// C# 8+ switch 表達式(更簡潔的寫法)
string dayName = dayNumber switch // 根據 dayNumber 回傳對應的字串
{
1 => "星期一", // 如果是 1,回傳「星期一」
2 => "星期二", // 如果是 2,回傳「星期二」
3 => "星期三", // 如果是 3,回傳「星期三」
4 => "星期四",
5 => "星期五",
6 or 7 => "週末", // 6 或 7 都回傳「週末」
_ => "無效" // _ 是預設值(等同 default)
};
Console.WriteLine(dayName); // 輸出:星期三
// 模式匹配(Pattern Matching)— 更進階的 switch
int temperature = 35; // 氣溫
string weather = temperature switch
{
<= 0 => "結冰了!", // 小於等於 0 度
> 0 and <= 15 => "很冷", // 0 到 15 度
> 15 and <= 25 => "舒適", // 15 到 25 度
> 25 and <= 35 => "很熱", // 25 到 35 度
> 35 => "超級熱!", // 超過 35 度
};
Console.WriteLine($"氣溫 {temperature}°C:{weather}"); // 輸出:氣溫 35°C:很熱
📌 for 迴圈
// for 迴圈:當你知道要重複幾次時使用
// for (初始值; 條件; 更新) { 要重複的程式碼 }
for (int i = 0; i < 5; i++) // i 從 0 開始,每次 +1,到 5 停止
{
Console.WriteLine($"第 {i} 次"); // 印出目前是第幾次
}
// 輸出:第 0 次、第 1 次、第 2 次、第 3 次、第 4 次
// 倒數迴圈
for (int i = 10; i >= 1; i--) // i 從 10 開始,每次 -1,到 1 停止
{
Console.WriteLine($"倒數:{i}"); // 印出倒數
}
// 九九乘法表(巢狀迴圈)
for (int i = 1; i <= 9; i++) // 外層:被乘數 1-9
{
for (int j = 1; j <= 9; j++) // 內層:乘數 1-9
{
// \t 是 Tab 字元,用來對齊
Console.Write($"{i}x{j}={i * j}\t"); // 印出乘法結果
}
Console.WriteLine(); // 每一列結束後換行
}
📌 foreach 迴圈
// foreach 用來走訪集合中的每一個元素
string[] fruits = { "蘋果", "香蕉", "橘子", "芒果" }; // 水果陣列
foreach (string fruit in fruits) // 依序取出每個水果
{
Console.WriteLine($"我喜歡吃 {fruit}"); // 印出每個水果
}
// 輸出:我喜歡吃 蘋果、我喜歡吃 香蕉、...
// foreach 也可以用 var
foreach (var fruit in fruits) // 讓編譯器自動推斷型別
{
Console.WriteLine(fruit); // 印出水果名稱
}
// 走訪字串中的每個字元
string word = "Hello"; // 一個英文字串
foreach (char c in word) // 字串是字元的集合
{
Console.Write($"{c} "); // 印出每個字元
}
// 輸出:H e l l o
📌 while 與 do-while 迴圈
// while 迴圈:先判斷條件,再執行
int count = 0; // 計數器從 0 開始
while (count < 3) // 當 count 小於 3 時持續執行
{
Console.WriteLine($"count = {count}"); // 印出目前的 count
count++; // count 加 1(很重要!否則會無窮迴圈)
}
// 輸出:count = 0、count = 1、count = 2
// do-while 迴圈:先執行一次,再判斷條件
string? input; // 使用者輸入的字串
do
{
Console.Write("請輸入 'exit' 離開:"); // 提示使用者
input = Console.ReadLine(); // 讀取輸入
} while (input != "exit"); // 當輸入不是 exit 時繼續
// do-while 保證至少執行一次
Console.WriteLine("程式結束"); // 使用者輸入 exit 後到這裡
📌 break、continue、return
// break — 立刻跳出迴圈
for (int i = 0; i < 10; i++) // 預計跑 10 次
{
if (i == 5) // 但當 i 等於 5 時
{
break; // 立刻停止迴圈
}
Console.WriteLine(i); // 只會印出 0, 1, 2, 3, 4
}
// continue — 跳過這次,繼續下一次
for (int i = 0; i < 10; i++) // 跑 10 次
{
if (i % 2 == 0) // 如果 i 是偶數
{
continue; // 跳過這次迴圈
}
Console.WriteLine(i); // 只會印出 1, 3, 5, 7, 9(奇數)
}
// return — 結束整個方法
// return 會在「方法與函式」章節詳細說明
📌 三元運算子 ? :
// 三元運算子是 if/else 的簡化寫法
// 語法:條件 ? 條件為 true 時的值 : 條件為 false 時的值
int age = 20; // 年齡
// 傳統 if/else 寫法
string status;
if (age >= 18)
{
status = "成年";
}
else
{
status = "未成年";
}
// 三元運算子寫法(一行搞定!)
string status2 = age >= 18 ? "成年" : "未成年"; // 條件成立回傳「成年」
Console.WriteLine(status2); // 輸出:成年
// 也可以直接在 Console.WriteLine 中使用
int score = 75; // 分數
Console.WriteLine(score >= 60 ? "及格 ✅" : "不及格 ❌");
// 輸出:及格 ✅
// ⚠️ 不要過度使用三元運算子
// 巢狀的三元運算子很難讀懂:
// string result = a > b ? (a > c ? "a最大" : "c最大") : (b > c ? "b最大" : "c最大");
// 建議複雜條件還是用 if/else 或 switch
🤔 我這樣寫為什麼會錯?
❌ 錯誤:忘記 break 導致穿透
// ❌ 錯誤:C# 的 switch 每個 case 都需要 break
switch (day)
{
case 1:
Console.WriteLine("星期一");
// 忘記 break → 編譯錯誤!(C# 不允許隱式穿透)
case 2:
Console.WriteLine("星期二");
break;
}
// ✅ 正確:每個 case 都要有 break(或 return)
switch (day)
{
case 1:
Console.WriteLine("星期一");
break; // 記得加 break
case 2:
Console.WriteLine("星期二");
break;
}
❌ 錯誤:無窮迴圈
// ❌ 錯誤:忘記更新計數器
int i = 0;
while (i < 5)
{
Console.WriteLine(i);
// 忘記 i++,i 永遠是 0,迴圈永遠不會停!
}
// ✅ 正確:
int j = 0;
while (j < 5)
{
Console.WriteLine(j);
j++; // 記得更新計數器!
}
❌ 錯誤:在 foreach 中修改集合
var list = new List<int> { 1, 2, 3, 4, 5 }; // 建立一個 List
// ❌ 錯誤:不能在 foreach 中修改正在走訪的集合
// foreach (var item in list)
// {
// if (item == 3) list.Remove(item); // 會拋出 InvalidOperationException
// }
// ✅ 正確:用 RemoveAll 或先轉成新的集合
list.RemoveAll(x => x == 3); // 移除所有等於 3 的元素