While 迴圈

極為常見

這邊第一個要介紹的迴圈是 while 迴圈,它是一個很基本的迴圈,就像它的名字一樣,當條件成立時就會一直執行迴圈中的程式,直到條件不成立為止。

基本語法

在上個單元裡,我們學會了如何使用 if 來判斷一個條件是否成立:

if (條件) {
    // 程式碼
}

while 的語法也很類似:

while (條件) {
    // 程式碼
}

if 不同的地方是,while 會一直執行迴圈中的程式,直到條件不成立為止,而 if 只會執行一次。

來看一個簡單的例子:

int x = 5;

while (x > 0) {
    cout << x << ' ';
    x--;
}

這個程式會印出 5 4 3 2 1,這是因為當 x 大於 0 時,會一直執行 cout << x << ' '; 這行程式,直到 x 變成 0 為止。

更仔細的解釋一下,這個程式的執行流程是這樣的:首先我們先設定一個變數叫做 x 它的功用是判斷我們什麼時候要離開迴圈。接著重頭戲來了,while 的語法是先寫一個 while 接著寫小括號,小括號中寫的通常是一個條件,如果該條件的目前結果是 true ,那麼就繼續執行迴圈中的程式,否則就不執行。注意這邊是先判斷條件是否成立,再決定要不要執行迴圈中的程式。

while 的執行流程就是會先判斷條件是否成立,如果成立就執行迴圈中的程式,否則就跳出迴圈。如下圖所示:

alt text

do-while 迴圈

do-while 迴圈是 while 迴圈的一種變形,跟 while 迴圈不同的地方是它會先執行一次迴圈中的程式,再來判斷是否要繼續執行迴圈(也就是說,do-while 迴圈至少會執行一次)。

具體流程圖如下:

alt text

接下來我們再來看一個簡單的例子:

int i = 0;

do {
    cout << i << ' ';
} while (i < 10);

這個技巧在某些情況下會很有用,未來我們也會在其他演算法中應用到這個語法!

無限迴圈

無限迴圈就是指迴圈中的條件永遠成立,這樣迴圈就會一直執行下去,直到程式被強制終止才會停下,通常都是撰寫者不小心寫出來的。應該要盡可能避免這樣的情況,否則可能會導致 TLE (Time Limit Exceeded) 的問題。

一個簡單的例子:

while (true) {
    cout << "Hello, World!" << '\n';
}

如果你的 while 迴圈執行的時候,終端機 ( terminal ) 沒有反應或是印出一堆文字,這時候通常是進入了所謂的無限迴圈,代表寫程式的時候沒有注意好離開迴圈的時機,導致程式不斷地卡在迴圈出不來。解決辦法很簡單,通常有兩種,第一種是直接找到跳不出迴圈的原因,第二種方法跟上面的程式很像,設定一個新的變數規定程式要在幾次內執行完,並且印出關鍵的資訊幫助 debug。

小測驗

while 迴圈與 do-while 迴圈的差別是什麼?