---
# System prepended metadata

title: 程式設計師一輩子的工具 - 迴圈 for/while/do-while
tags: [東華大學資管系, 資管經驗分享, 東華大學, 大一程設, 基本程式概念]

---

---
GA: G-RZYLL0RZGV
---

###### tags: `大一程設` `東華大學` `東華大學資管系` `基本程式概念` `資管經驗分享`

程式設計師一輩子的工具 - 迴圈 for/while/do-while
===

[TOC]

## 前言

迴圈可以說是程式設計師在開發時不可或缺的工具，迴圈能夠讓我們反覆執行一段程式，直到條件失敗或是我們終止這個迴圈，讓他不再執行。

舉個實例，大家在玩遊戲時，除非你關閉遊戲，不然遊戲會一直執行，而一直執行這件事就是依靠迴圈。又或是今天你想算出 1 累加到 100 為多少，你也可以依靠迴圈幫你累加。

像這樣:

```cpp=
    int main(){
        int ans = 0;
        for(int i = 1; i <= 100; i++){
            ans += i; // 答案是 5050
        }
    }
```

當然腦筋動得快的同學會說，這麼麻煩，直接梯形公式不就可以了嗎?幹嘛還要用到這個迴圈?
確實，這是最正確的思維，可是今天若只單純地用梯形公式，我們的程式會被限縮，他就只能這做這件事，但今天一個迴圈可能會做的事不只這一件，甚至是要利用其中的值來為我們做其他的運算，比方說，程式執行加到第 30 次的時候要印出，今天天氣真好，那就不可能用梯形公式做出來。

```cpp=
    int main(){
        int low = 1, upper = 100;
        int ans = 0;
        ans = (low+upper)*(upper+low-1)/2; //也是 5050
        //但能做的事非常限縮
        
        for(int i = 1; i <= 100; i++){
            ans += i; // 答案是 5050
            if(i == 30) cout << "今天天氣真好\n";
            
            if(i % 2 == 0) cout << "我是偶數次\n";
            else cout << "我是奇數次\n";
        }
        
        //用迴圈的話我們能夠額外做很多事
        
    }
```

這就是**為什麼要學習迴圈**，**因為程式能夠做擴充，而且能夠增加易讀性**，真的是非常方便的工具，請一定要學起來。

## for

`tips: 很早就說過，程式語言很多事情語法是固定的沒有為什麼， for 就是最好的例子`

語法格式:

![](https://i.imgur.com/RVFvSye.png)

```
    for(初值; 條件; 步進){
        //迴圈細節
    }
```

解釋:
* **初值**
    * 迴圈要從哪個值開始
* **條件**
    * 當初值經過迴圈一次次的改變，違反條件的時候迴圈結束，若滿足條件則繼續執行
* **步進**
    * 初值每次增加多少

範例:
就以剛才 1 累加到 100 為例，我們來了解迴圈的運作。

```cpp=
    int main(){
        int ans = 0;
        for(int i = 1; i <= 100; i++){
            ans += i; // 答案是 5050
        }
    }
```

* 初值為 1
* 條件為當 i <= 100 就會執行迴圈內容，若否則不會結束迴圈
* 步進 i++，i 值每次加 1


| 次數 |       ans        | i值 |
| ---- |:----------------:|:---:|
| 1    |   ans = 0 + 1    |  1  |
| 2    |   ans = 1 + 2    |  2  |
| 3    |   ans = 3 + 3    |  3  |
| 4    |   ans = 6 + 4    |  4  |
| 5    |   ans = 10 + 5   |  5  |
| 6    |   ans = 15 + 6   |  6  |
| 7    |   ans = 21 + 7   |  7  |
| 100  | ans = 4950 + 100 | 100 |

這邊可能會比較疑惑的點是 ans 的地方，ans 會被反覆的更改，而我們講過「=」代表的是指派，所以每次會把上一次的值指派給 ans，把舊的蓋過去。

## while

while 也是迴圈的一種，我們等等會來談談兩者的使用時機，我們先來看看 while 是什麼。

語法格式:

```
    初值
    while(條件){
    /*while 迴圈內容
     * 
     * 
     * 
     * */
    
     步進
    }
```

我們同樣用累加到 100 作為範例。

```cpp=
    int main(){
        //初值
        int low = 1, upper = 100;
        int ans = 0;
        while(low <= 100){ // 條件
            ans = ans + low; // 迴圈細節
            low++; // 步進
        }
    }
```

而這裡的初值、條件、步進與 for 完全相同，所以其實我們可以得到一個小結論，只要能用 for 寫的迴圈，就一定可以用 while 寫，因為只有一些語法的不同而已。

**while的注意事項:**
* 初值要在進入 while 迴圈前先被指派，**不能放在迴圈內**
    * **放在迴圈內的話每一次都會被更新為初值喔**
* 通常步進一定會放在最後 (當然要看你的需求怎麼設計，也有可能不會滿足這件事)

## do-while

do-while 與 while 只有一點小差別，我們先看 do-while 的語法。

語法格式:
```
    初值
    do{
        /*                
        迴圈細節                        
        */
        步進
    }while(條件);
```
**do-while 與 while 的差異在於，do-while 一定會執行迴圈一次，而 while 有可能不會執行，只要不滿足條件。**
所以在 do 的這個範圍內代表的就是 while 的程式細節，只是我一定會先執行一次。所以可以看你遇到的需求適合用哪一種迴圈就使用哪一種。

舉個小例子，因為疫情都需要實名制，若是兩人或以上同行可以選擇只留下一個人的資料，但你不能不留資料(就表示一定要執行一次)，透過這樣的思維，我們可以寫下如下的程式。

```cpp=
    int main(){
        char keep = ' ';
        string name = "";
        string the_phone_last_three_word = "";
        
        cout << "請留下以下的資料哦" << endl;
        do{
            cout << "你的大名?" << endl;
            cin >> name;
            cout << "請輸入您的手機末三碼" << endl;
            cin >> the_phone_last_three_word;
            
            cout << "還要繼續輸入嗎?\n"
                << "要繼續請輸入 y \n"
                << "若不用請輸入任意字元終止 \n";
            
            cin >> keep;
        
        }while(keep == 'y');
        
        cout << "程式結束";
        return 0;
    }
```

因為一定會執行一次，所以當程式執行時 8-17 行一定會執行一次，當 19 行的條件成立，再從 8 執行到 17 行，周而復始，直到條件不成立為止。

你會發現，用 do-while 有可能甚至不用初值，完全端看需求是什麼，相信這個例子能夠更幫大家了解 do-while 的內容。

## for、while 的使用時機

兩個都是迴圈，能夠做到的事也相同，究竟差在哪裏呢? 就是使用時機，透過上面的例子我們可以發現，使用 for 的時候我們會先明訂我們會做幾次，但 while 卻不會，這也就是兩者的最大使用差異。

何時用 for ?
* **當你知道明確的執行次數時**

何時用 while ?
* **當不知道明確的執行次數時**

> 結論:兩種你都要會
> [name=orange]

## 補充 - 遞增與遞減 `++`、`--`

相信在看迴圈時 `++`、`--` 這兩個運算子影響了不少人，雖然你明確的知道了他就是往上 +1，但其實它沒有想像中那麼簡單哦。

### 放前與放後，兩者大不同

|        前置式        |         後置式         |
|:--------------------:|:----------------------:|
| 先做`++` `--` 再取值 | 先取值，再做 `++` `--` |
| `++i` `--i`| `i++` `i--` |

相信這樣看一定看不懂，我們直接舉例，

```cpp=
    int main(){
        int A = 5, B = 5;
        int x = A++;
        int y = ++B;
        
        cout << x << endl; // 5
        cout << y << endl; // 6
        cout << A << endl; // 6
        cout << B << endl; // 6
    }
```
透過上面的表格，我們理解前置式跟後置式的差異，所以第三行後置式，先做取值再做 +1，所以我們先把 A 指派給變數 x，再把 A 做 +1 的動作，因此 x 會印出 5，A 會印出 6。
那前置式就同理可證。先做 +1 再指派。

## 無窮迴圈

無窮迴圈常常發生在遊戲開發中，因為你總不希望玩遊戲玩到一半忽然關掉吧。
for 跟 while 都有無窮迴圈的樣子，學過 if-else，你們覺得應該會長什麼樣子呢?

* for
```
    for(;true;)
    {
    
    }    
    又或是    
    for(;;)
    {
    
    }
```
* while
```
    while(true){
    
    }
```
這邊看的出來，當條件恆成立的時候，我們就會一直執行迴圈內的內容，但是無窮迴圈不可能不終止掉的，你玩遊戲也會有想結束的時候，如果今天一個無窮迴圈沒有設立終止條件，你的電腦是會當機的。所以接下來我們來談談下面的關鍵字。
## 不要再執行了!迴圈終止工具 break、continue

在談到迴圈，不可避免一定要提這兩個保留字，因為他是能夠幫我們終止迴圈的好幫手，我們馬上來談談。


|    break     |           continue           |
|:------------:|:----------------------------:|
| 完全終止迴圈 | 終止這一次的迴圈，執行下一次 |

舉個例子
* break
```cpp=
    int main(){
        int a = 0;
        while(true){
            a++;
            cout << a << endl;
            if(a>10)break;
        }
    }
```
我相信應該不難理解吧!當 a > 10的時候，這個迴圈就會結束。
* continue
```cpp=
    int main(){
        int a = 0;
        while(true){
            a++;
            if(a % 2 == 0) continue;
            cout << a << endl;
            if(a>100)break;
        }
    }
```
這應該也不難理解，當 a 是偶數的時候會進入第一個 if 判斷式，因為遇到 continue，所以第 6 行開始都不執行了，直接從第 3 行再來執行，因為 while(true) 條件必成立，就再執行下一次。

> 可以把程式碼 run 在自己的電腦上看看結果是什麼
> 你覺得 a 最後一個是印出 99 還是 101 呢?
> 答案可能不如你所想喔
> [name=orange]


