第十六章 控制迴圈
Controlling Loops
16.1 選擇迴圈的種類
Selecting the Kind of Loop
第一種分類方式
- 計數迴圈
- 條件式迴圈
- 無窮迴圈
- 迭代迴圈
-
A. 由彈性來區分
- 執行一定的次數---->使用for
- 檢查是否完成----->使用while並參考B分類
- 開頭
- 中段
- 尾處
檢查處之後的程式碼,不一定會執行。
使用While迴圈的時機
When to Use a while Loop
不知道重覆多少次時(A.2.類)
前測式迴圈
Loop with Test at the Beginning
while() {}
後測試迴圈
Loop with Test at the End
do{} while();
使用loop-with-exit迴圈的使用時機(中段結束)
When to Use a loop-with-exit Loop
正常的loop-with-exit迴圈
Normal loop-with-exit Loops
while(1){ //... if (somethingHappen) break; //... }1. 結束條件放在同一處
2. 單一出人口的結構(易於理解)
3. 可讀性高,符合人對重複控制方式的思考概念
不正常的loop-with-exit迴圈
Abnormal loop-with-exit Loops
goto Start; while(expression){ //... Start: //... }雖然唯一出入口,但是有兩個問題
1. 使用goto
2. 導致混亂
使用For迴圈的時機
When to Use a for Loop
-
執行一定次數的迴圈時
for迴圈:「迴圈控制」、「迴圈內容」是分開的,用於簡單的用途
for = foreach
16.2 控制迴圈
Controlling the Loop
迴圈可能發生的錯誤:
- 初始化不正確或漏掉了
- 累加器或其它迴圈控制變數沒有初始化
- 錯誤的巢狀結構
- 結束不正確
- 忘記使用迴圈變數的數值增加
- 迴圈索引值不正確
兩項守則
- 簡化!簡化!簡化!(維護迴圈控制的概念整理性)
- 迴圈內部視為常式(降低迴圈控制和迴圈內容的耦合)
設計成黑盒子
進入迴圈
Entering the Loop
單一化初始化變數(確定迴圈會開始)
無限迴圈 while(1)
固定次數 for() 不使用while,控制迴圈的程式可以包在一起
不固定次數 while() 不使用for,for的彈性會濫用
處理迴圈內容
Processing the Middle of the Loop
用{}包起來避免空回圈、單一化迴圈功能
控制迴圈的部份留在開頭或結尾(確定迴圈會進行)
離開迴圈
Exiting the Loop
簡化迴圈終止的條件式(確定迴圈會結束)迴圈結束後就不要使用迴圈索引值
考慮使用安全計數器
提早離開迴圈
Exiting Loops Early
在while中用break比bool變數好太多break代表要拆成很多迴圈,而不是一個迴圈很多出口
使用continue是為了跳造迴圈主體大多數的code,若跳過的code少,就用if吧
如果語言支援,就用「break 標籤」的用法
謹慎使用break和continue
單一陳述式->簡化迴圈
使用break->增加迴圈複雜性
檢查端點
Checking Endpoints
三個要注意的地方:- 第一次執行
- 最後一次執行
- 執行到一半
這是好的程式設計師和壞的程式設計師的差別。
使用迴圈變數
Using Loop Variables
使用整數或列舉有意義的變數提高可讀性,但是要避免重覆
變數Scop限制在迴圈中
迴圈的理想長度為何?
How Long Should a Loop Be?
一目了然不超過三層巢狀
長型迴圈->單一出口
簡單迴圈->可以用break、continue、多重出口、複雜的結束式
16.3 輕鬆建立迴圈-由內而外
Creating Loops Easily—from the Inside Out
- 用常數開始
- 在文字外圍加迴圈,用變數取代常數
- 重覆2.
16.4 迴圈與陣列間的關聯性
Correspondence Between Loops and Arrays
不一定有關係
沒有留言:
張貼留言
(什麼是留言欄訊息?)