流程控制
預設情況下程式由上而下、一個接一個地執行它的述句,就像逐行讀食譜。但真實的任務需要選擇(「如果下雨,帶把傘」)與重複(「攪拌到滑順為止」)。流程控制就是一組構造,讓程式能決定要執行哪些述句、執行幾次——把直線路徑彎成分支與迴圈。
C 提供一套小而完整的工具。做選擇:if 與 if/else 只在條件成立時執行一個區塊;switch 依一個整數值選出眾多帶標籤 case 之一,case 會落入下一個,除非你寫 break。做重複:while 在每一輪之前測試條件(它可能執行零次);do-while 在本體之後測試(所以至少執行一次);for 把初始化、測試、更新捆進一行,很適合計數迴圈。在迴圈內,break 立即離開迴圈、continue 跳到下一次迭代。最後 goto 跳到同一函式內的帶標籤述句——很少需要,但偶爾用來在出錯時跳到單一的清理段落。
為什麼重要:這些構造是所有演算邏輯的表達方式;從一個選單到一個遊戲迴圈,全都由它們建成。兩個誠實的告誡:在 switch 的 case 忘了 break 會造成意外落入下一個 case(有時是真錯誤,有時是刻意的),而 goto 雖然合法、偶爾對錯誤清理有用,但若濫用會把程式碼纏成「義大利麵」——結構化的迴圈與函式幾乎總是更清楚。
for (int i = 0; i < 3; i++) { if (i == 1) continue; /* 本輪跳過其餘部分 */ printf("%d\n", i); /* 印出 0 然後 2 */ } switch (grade) { case 'A': puts("top"); break; /* break 阻止落入下一個 */ default: puts("other"); }
帶 continue 的 for 迴圈跳過 i==1;switch 用 break 阻止一個 case 落入下一個。
switch 的 case 會落入下一個,除非你寫 break——一個很常見的錯誤。while 可能執行零次;do-while 至少執行一次。濫用 goto 會產生纏結的程式碼,不過用單一向前的 goto 做錯誤清理是被接受的慣用法。