不學 JAVA 換學 C# 之覺得心累 - L1:ch6 迴圈

AdSense

前言

迴圈 (loop) 是執行重複邏輯和運算的基礎結構。透過迴圈,程式可以根據條件反覆執行程式碼區塊,直到滿足指定的終止條件為止。

while 迴圈

某條件為 true 時執行程式碼,並在條件變為 false 時停止,結束 while 迴圈。

語法

1
2
3
4
while (條件)
{
// 重複執行的程式碼
}

注意

  1. 條件先測試:在執行程式碼前,會先檢查條件是否為 true
  2. 避免無窮迴圈:務必確保條件能變成 false,否則會導致無窮循環。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
int i = 0;
while (i < 5)
{
Console.WriteLine($"迴圈次數:{i}");
i++;
}

// 輸出:
// 迴圈次數:0
// 迴圈次數:1
// 迴圈次數:2
// 迴圈次數:3
// 迴圈次數:4

do...while 迴圈

確保程式碼區塊至少執行一次,然後在條件為 true 時重複執行。

語法

1
2
3
4
do
{
// 重複執行的程式碼
} while (條件);

適用場景

適合用在需要先執行某些操作再檢查條件的場合,例如:要求使用者輸入直到符合條件。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
int i = 0;
do
{
Console.WriteLine($"迴圈次數:{i}");
i++;
} while (i < 5);

// 輸出:
// 迴圈次數:0
// 迴圈次數:1
// 迴圈次數:2
// 迴圈次數:3
// 迴圈次數:4

for 迴圈

適用於已知執行次數的情況,將初始化、條件檢查和更新集中於一個結構中。

語法

1
2
3
4
for (初始化; 條件; 疊代器)
{
// 重複執行的程式碼
}
  1. 初始化 - int i = 0:在開始迴圈前,宣告和初始化迴圈變數,這個迴圈變數無法從 for 外部存取。
  2. 條件 - i < 5:當條件為 true 時執行程式碼,並在條件變為 false 時停止,結束 for 迴圈。
  3. 疊代器 - i++:每次程式碼區塊被執行之後,變數所進行的更新,要確保更新後的變數會讓條件變成 false,否則會導致無窮循環。

例子

1
2
3
4
5
6
7
8
9
10
11
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"迴圈次數:{i}");
}

// 輸出:
// 迴圈次數:0
// 迴圈次數:1
// 迴圈次數:2
// 迴圈次數:3
// 迴圈次數:4

foreach 迴圈

專門用來遍歷集合物件,例如:陣列。

語法

1
2
3
4
foreach (var 元素 in 集合物件)
{
// 重複執行的程式碼
}

特點

  • 不需要管理索引:迴圈會自動遍歷集合中的每個元素,有效避免陣列越界等問題。
  • 唯讀性:用來讀取集合中的元素,但無法修改元素值。如果需要更改元素值,建議使用 for 迴圈。

例子

1
2
3
4
5
6
7
8
9
10
11
12
int[] numbers = { 0, 1, 2, 3, 4 };
foreach (int number in numbers)
{
Console.WriteLine($"迴圈次數:{number}");
}

// 輸出:
// 迴圈次數:0
// 迴圈次數:1
// 迴圈次數:2
// 迴圈次數:3
// 迴圈次數:4

巢狀迴圈

巢狀迴圈是將一個迴圈嵌套在另一個迴圈內部。每次外部迴圈執行一次,內部迴圈會完整執行。

1
2
3
4
5
6
7
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
Console.WriteLine($"外部:{i},內部:{j}");
}
}

最佳化迴圈效能技巧

  1. 避免不必要的運算:將不變的運算移出循環。
    1
    2
    3
    4
    5
    int sum = a + b;
    while (x < sum)
    {
    // ...
    }
  2. 最佳化短路運算:讓常見條件出現在 &&|| 運算子的前面。
  3. 合併循環(loop fusion):將結構相似的兩個循環合併。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 合併前
    for (int i = 0; i < 100; i++) a[i] = 1;
    for (int i = 0; i < 100; i++) b[i] = 2;

    // 合併後
    for (int i = 0; i < 100; i++)
    {
    a[i] = 1;
    b[i] = 2;
    }
  4. 使用 Stopwatch:觀察程式執行時間
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    using System.Diagnostics;

    Stopwatch sw = Stopwatch.StartNew();
    // 在這裡執行需要測試的迴圈
    for (int i = 0; i < 1000000; i++)
    {
    // ...
    }
    sw.Stop();

    Console.WriteLine($"執行時間:{sw.ElapsedMilliseconds} 毫秒");

breakcontinue 的使用

break 表示強制結束迴圈,不再執行後續的迴圈邏輯。適合用於當條件滿足時,不需要繼續執行的情境。

1
2
3
4
5
6
7
8
9
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
break; // 當 i 等於 5 時,跳出迴圈
}
Console.WriteLine(i);
}
// 輸出:0, 1, 2, 3, 4

在巢狀迴圈中,break 只會終止包含它的該層迴圈,外部迴圈還是會繼續執行。

continue 表示強制結束該次迴圈,不執行剩下的程式碼,重新開始新的一輪。適合用於忽略不符合條件的元素,並繼續處理剩餘項目。

1
2
3
4
5
6
7
8
9
for (int i = 0; i < 10; i++)
{
if (i % 2 == 0)
{
continue; // 當 i 是偶數時,跳過後續的迴圈邏輯,重新開始新的一輪
}
Console.WriteLine(i);
}
// 輸出:1, 3, 5, 7, 9

參考資料:
反覆運算陳述式:forforeachdowhile
跳躍陳述式 - breakcontinuereturngoto