文章目錄
C# 的跳躍語法( break continue goto 與 return)
最近看了一段程式,感覺跑的順序跟預期的不同,查了 msdn 文件,順手做了個紀錄。 文件請務必看英文版,中文版的錯很大,完全不是同個意思XD
break
終止最近一層的
迴圈
(while
,do
,for
,foreach
) 或switch
,接著執行後續程式碼
程式碼範例 1 :單層迴圈
for (int i = 1; i <= 100; i++) { if (i == 5) { break; } Console.WriteLine(i); } Console.WriteLine("end");
- 跑第五次時遇到
break
跳離最近一層的迴圈
或switch
–> 接著執行Console.WriteLine("end");
- 執行結果
- 跑第五次時遇到
程式碼範例 2 :雙層迴圈
for (int a = 1; a <= 3; a++) { for (int i = 1; i <= 100; i++) { if (i == 5) { break; } Console.WriteLine($"第二層:{a}_{i}"); } Console.WriteLine($"第一層:{a}"); } Console.WriteLine("end");
- 僅會跳離最近一層迴圈(本例來看就是變數 i 這層),外層 (變數 a 這層不受影響)
- 執行結果
continue
會跳離最近一層迴圈該次迴圈(該次迴圈 continue 之後的內容皆不會執行),執行(
while
,do
,for
,foreach
)的下一個迭代(迴圈內容)
程式碼範例 1 :單層迴圈
for (int i = 1; i <= 10; i++) { if (i < 9) { continue; } Console.WriteLine(i); } Console.WriteLine("end");
i < 9
就跳離接著執行迴圈下一個內容直到i >=9
才會執行到Console.WriteLine(i);
- 執行結果
程式碼範例 2 :雙層迴圈
for (int a = 1; a <= 3; a++) { for (int i = 1; i <= 10; i++) { if (i < 9) { continue; } Console.WriteLine($"第二層:{a}_{i}"); } Console.WriteLine($"第一層:{a}"); } Console.WriteLine("end");
- 僅會跳離最近一層迴圈(本例來看就是變數 i 這層),外層 (變數 a 這層不受影響)
- 執行結果
goto
改執行標記程式碼區段位置
for (int i = 1; i <= 10; i++) { if (i >= 9) { goto TestLabel; } Console.WriteLine(i); } Console.WriteLine("end"); TestLabel: Console.WriteLine("Test goto label"); Console.WriteLine("Test goto label1"); Console.WriteLine("Test goto labe end");
i >= 9
就會跳至TestLabel
重新開始執行執行結果
改執行 switch 中其他 case 區段或是 default 區段
int n = default(int); int cost = default(int); n = 2; //n = 3; switch (n) { case 1: Console.WriteLine("case 1"); cost += 25; break; case 2: Console.WriteLine("case 2"); cost += 25; goto case 1; case 3: Console.WriteLine("case 3"); cost += 50; goto default; default: Console.WriteLine("default"); break; } Console.WriteLine($"n={n},end:{cost}");
n = 2
執行case 2
後改執行case 1
執行結果
n = 3
執行case 3
後改執行default
執行結果
用來跳離巢狀迴圈
for (int a = 1; a <= 3; a++) { for (int i = 1; i <= 10; i++) { if ( a ==2 && i == 9) { goto TestLabel; } Console.WriteLine($"第二層:{a}_{i}"); } Console.WriteLine($"第一層:{a}"); } TestLabel: Console.WriteLine("Test goto label"); Console.WriteLine("Test goto label1"); Console.WriteLine("Test goto labe end");
- 第一層執行第二次,第二層執行至第九次時,跳至
TestLabel
重新開始執行 執行結果
- 第一層執行第二次,第二層執行至第九次時,跳至
return
會停止所在方法的執行,將程式執行權回歸原呼叫方法並回傳值
void Main() { Console.WriteLine("before function"); Console.WriteLine($"call function result:{Getint()}"); Console.WriteLine("after function"); } int Getint() { Console.WriteLine("call function"); int result= default(int); return result; }
- 執行結果
可用來跳出迴圈,switch
迴圈
void Main() { for (int i = 1; i <= 10; i++) { if (i >= 9) { return; } Console.WriteLine(i); } Console.WriteLine("end"); }
執行結果
switch
void Main() { int n = default(int); int cost = default(int); n = 2; //n = 3; switch (n) { case 1: Console.WriteLine("case 1"); cost += 25; break; case 2: Console.WriteLine("case 2"); return; cost += 25; goto case 1; case 3: Console.WriteLine("case 3"); cost += 50; goto default; default: Console.WriteLine("default"); break; } Console.WriteLine($"n={n},end:{cost}"); }
執行結果
void 方法可以不寫 return,也沒回傳值,僅用來轉換程式執行權
void Main() { Console.WriteLine("before function"); test(); Console.WriteLine("after function"); } void test() { Console.WriteLine("CALL test"); return ; Console.WriteLine("after return"); }
- 執行結果
return 被 try 包著,會先執行 finally 內容
void Main() { Console.WriteLine("before function"); test(); Console.WriteLine("after function"); } void test() { try { Console.WriteLine("function try"); return; } catch (Exception ex) { Console.WriteLine("catch"); throw; } finally { Console.WriteLine("function finally"); } }
- 執行結果
參考資料
文章作者 Yowko Tsai
上次更新 2021-11-03
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。