重複結構

for迴圈

for-loop 主要是用來處理重複特定「次數」的迴圈

for迴圈的寫法如下:

for (初始宣告; 條件式; 迭代器變化量) {
    /*code here*/
}

要注意,間隔三個敘述是使用分號,不是逗號。
迭代器 iterator : 指用來遍歷特定範圍的變數,
其中的初始宣告指的也是迭代器的初始宣告。

例如:

for (int i = 1; i <= 10; i++)
    cout << i << ' ';
cout << endl;

輸出:
1 2 3 4 5 6 7 8 9 10

  • c++11的新增寫法:

    ​​​​for (迭代器 : 執行範圍) {
    ​​​​    /*code here*/
    ​​​​}
    

    這種寫法的間隔符號是冒號,對執行範圍內的每個單元重複執行。

    例如:

    ​​​​string s;
    ​​​​for (char c : s) {
    ​​​​    /*code here*/
    ​​​​}
    

    可以針對s字串中的每個字元重複執行。

    且c++11也新增了自動型別 auto ,使得這種寫法更為便利,例如:

    ​​​​map<int, int> myMap;
    ​​​​for (map<int, int>::iterator it = myMap.begin(); it != myMap.end(); it++) {
    ​​​​    /*code here*/
    ​​​​}
    

    可以寫成

    ​​​​map<int, int> myMap;
    ​​​​for (map<int, int>::iterator it : myMap) {
    ​​​​    /*code here*/
    ​​​​}
    

    可以再寫成

    ​​​​map<int, int> myMap;
    ​​​​for (auto it : myMap) {
    ​​​​    /*code here*/
    ​​​​}
    

    相比第一個看起來簡單非常多吧!而且還更好理解。
    (這段範例程式碼有些還沒講過的內容,例如 map,之後會再講到)

巢狀迴圈

巢狀迴圈就是迴圈內還有一個或一個以上的迴圈,以下為列印三角形的例子:

for (int i = 0; i < 5; i++){
    for (int j = 0; j <= i; j++) cout << "★";
    cout << endl;
}

輸出結果:

★
★★
★★★
★★★★
★★★★★

while迴圈

while-loop 主要是用來處理具有特定「條件」的迴圈,
只要滿足條件式,就進入迴圈,直到不滿足條件才結束。

while迴圈的寫法如下:

while (條件式) {
    /*code here*/
}

例如:

int next;
cin >> next;
while (next != 0) { //也可以寫成 while (next) ...
    /*code here*/
    cin >> next;
}

會一直等待使用者輸入,直到輸入值為0後結束。


do-while迴圈

與while迴圈基本相同,但是會先執行一次,才開始判斷條件式。

do-while迴圈的寫法如下:

do {
    /*code here*/
} while (條件式);

以與while迴圈的範例程式設計出同樣的功能為例:

int next;
do {
    cin >> next;
    /*code here*/
} while (next);

看起來更簡潔一些也更好理解對吧!
while迴圈與do-while迴圈都有適合的用途,就看使用者怎麼去運用。

在寫程式時要特別注意,for迴圈與while迴圈的後面都不用加分號,但是do-while迴圈需要。

改變迴圈執行

  • continue

continue在迴圈中出現時,可以跳過在coutinue後方的敘述,並回到迴圈的開頭,執行下一次的迴圈。以上敘述可能比較不好理解,以下舉個例子來說明:

for (int i = 1; i <= 3; i++){
    if (i == 2) continue;
    cout << i << endl;
}

輸出結果:

1
3

在上述程式碼中,i2時,讓他continue回到迴圈的起點,執行下一次迴圈,並不會執行當次if後面的敘述。

  • break
    break指令可以直接跳離該迴圈,並繼續執行迴圈外的敘述,在上一章節的選擇結構中,有提到switch在每次case結束時,都需要break出去,以免會繼續往下執行,下面一樣舉一個簡單的例子來說明:
for(int i = 1; i <= 10000; i++){
    if (i == 5) break;
    cout << i << endl;
}

輸出結果:

1
2
3
4
  • goto
    goto語法不建議使用,除了容易造成程式碼閱讀上的不便,也會容易形成不容易尋找的錯誤,想要知道如何使用請自行Google,可以閱讀知名論文goto有害論原文。