不學 JAVA 換學 C# 之覺得心累 - L1:ch6 迴圈
AdSense
前言
迴圈 (loop) 是執行重複邏輯和運算的基礎結構。透過迴圈,程式可以根據條件反覆執行程式碼區塊,直到滿足指定的終止條件為止。
while
迴圈
某條件為 true
時執行程式碼,並在條件變為 false
時停止,結束 while
迴圈。
語法
1 | while (條件) |
注意
- 條件先測試:在執行程式碼前,會先檢查條件是否為
true
。 - 避免無窮迴圈:務必確保條件能變成
false
,否則會導致無窮循環。
例子
1 | int i = 0; |
do...while
迴圈
確保程式碼區塊至少執行一次,然後在條件為 true
時重複執行。
語法
1 | do |
適用場景
適合用在需要先執行某些操作再檢查條件的場合,例如:要求使用者輸入直到符合條件。
例子
1 | int i = 0; |
for
迴圈
適用於已知執行次數的情況,將初始化、條件檢查和更新集中於一個結構中。
語法
1 | for (初始化; 條件; 疊代器) |
- 初始化 -
int i = 0
:在開始迴圈前,宣告和初始化迴圈變數,這個迴圈變數無法從for
外部存取。 - 條件 -
i < 5
:當條件為true
時執行程式碼,並在條件變為false
時停止,結束for
迴圈。 - 疊代器 -
i++
:每次程式碼區塊被執行之後,變數所進行的更新,要確保更新後的變數會讓條件變成false
,否則會導致無窮循環。
例子
1 | for (int i = 0; i < 5; i++) |
foreach
迴圈
專門用來遍歷集合物件,例如:陣列。
語法
1 | foreach (var 元素 in 集合物件) |
特點
- 不需要管理索引:迴圈會自動遍歷集合中的每個元素,有效避免陣列越界等問題。
- 唯讀性:用來讀取集合中的元素,但無法修改元素值。如果需要更改元素值,建議使用
for
迴圈。
例子
1 | int[] numbers = { 0, 1, 2, 3, 4 }; |
巢狀迴圈
巢狀迴圈是將一個迴圈嵌套在另一個迴圈內部。每次外部迴圈執行一次,內部迴圈會完整執行。
1 | for (int i = 1; i <= 3; i++) |
最佳化迴圈效能技巧
- 避免不必要的運算:將不變的運算移出循環。
1
2
3
4
5int sum = a + b;
while (x < sum)
{
// ...
} - 最佳化短路運算:讓常見條件出現在
&&
或||
運算子的前面。 - 合併循環(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;
} - 使用
Stopwatch
:觀察程式執行時間1
2
3
4
5
6
7
8
9
10
11using System.Diagnostics;
Stopwatch sw = Stopwatch.StartNew();
// 在這裡執行需要測試的迴圈
for (int i = 0; i < 1000000; i++)
{
// ...
}
sw.Stop();
Console.WriteLine($"執行時間:{sw.ElapsedMilliseconds} 毫秒");
break
和 continue
的使用
break
表示強制結束迴圈,不再執行後續的迴圈邏輯。適合用於當條件滿足時,不需要繼續執行的情境。
1 | for (int i = 0; i < 10; i++) |
在巢狀迴圈中,break
只會終止包含它的該層迴圈,外部迴圈還是會繼續執行。
continue
表示強制結束該次迴圈,不執行剩下的程式碼,重新開始新的一輪。適合用於忽略不符合條件的元素,並繼續處理剩餘項目。
1 | for (int i = 0; i < 10; i++) |
參考資料:
反覆運算陳述式:for
、foreach
、do
和 while
跳躍陳述式 - break
、continue
、return
和 goto