對於迴圈

for 迴圈在 loop body 中執行語句,而迴圈 condition 為 true。迴圈之前 initialization statement 只執行一次。每個迴圈後,執行 iteration execution 部分。

for 迴圈定義如下:

for (/*initialization statement*/; /*condition*/; /*iteration execution*/)
{
    // body of the loop
}

佔位符語句的說明:

  • initialization statement:此語句僅在 for 迴圈開始時執行一次。你可以輸入一種型別的多個變數的宣告,例如 int i = 0, a = 2, b = 3。這些變數僅在迴圈範圍內有效。在迴圈執行期間隱藏在具有相同名稱的迴圈之前定義的變數。
  • condition:此語句在每個迴圈體執行之前進行評估,如果計算結果為 false 則中止迴圈。
  • iteration execution:這個語句在迴圈之後執行,在下一個條件評估之前,除非 for 迴圈在體內被中止 (通過 breakgotoreturn 或丟擲異常)。你可以在 iteration execution 部分輸入多個語句,例如 a++, b+=10, c=b+a

一個 for 迴圈的粗略等價,重寫為 while 迴圈是:

/*initialization*/
while (/*condition*/)
{
    // body of the loop; using 'continue' will skip to increment part below
    /*iteration execution*/
}

使用 for 迴圈的最常見情況是執行特定次數的語句。例如,請考慮以下事項:

for(int i = 0; i < 10; i++) {
    std::cout << i << std::endl;
}

有效迴圈還包括:

for(int a = 0, b = 10, c = 20; (a+b+c < 100); c--, b++, a+=c) {
    std::cout << a << " " << b << " " << c << std::endl; 
}

在迴圈之前隱藏宣告變數的示例是:

int i = 99; //i = 99
for(int i = 0; i < 10; i++) { //we declare a new variable i
    //some operations, the value of i ranges from 0 to 9 during loop execution
}
//after the loop is executed, we can access i with value of 99

但是如果你想使用已經宣告的變數而不是隱藏它,那麼省略宣告部分:

int i = 99; //i = 99
for(i = 0; i < 10; i++) { //we are using already declared variable i
    //some operations, the value of i ranges from 0 to 9 during loop execution
}
//after the loop is executed, we can access i with value of 10

筆記:

  • 初始化和增量語句可以執行與條件語句無關的操作,或者根本不執行任何操作 - 如果你希望這樣做。但出於可讀性原因,最佳做法是僅執行與迴圈直接相關的操作。
  • 初始化語句中宣告的變數僅在 for 迴圈的範圍內可見,並在迴圈終止時釋放。
  • 不要忘記在 initialization statement 中宣告的變數可以在迴圈期間修改,以及在 condition 中檢查的變數。

從 0 到 10 計數的迴圈示例:

for (int counter = 0; counter <= 10; ++counter)
{
    std::cout << counter << '\n';
}
// counter is not accessible here (had value 11 at the end)

程式碼片段的說明:

  • int counter = 0 將變數 counter 初始化為 0.(此變數只能在 for 迴圈內使用。)
  • counter <= 10 是一個布林條件,檢查 counter 是否小於或等於 10.如果是 true,則迴圈執行。如果是 false,則迴圈結束。
  • ++counter 是一個遞增操作,它在下一個條件檢查之前將 counter 的值增加 1。

通過將所有語句留空,可以建立無限迴圈:

// infinite loop
for (;;)
    std::cout << "Never ending!\n";

與上述相當的 while 迴圈是:

// infinite loop
while (true)
    std::cout << "Never ending!\n";

但是,仍然可以通過使用語句 breakgotoreturn 或通過丟擲異常來保留無限迴圈。

在不使用 <algorithm> 標頭的情況下迭代來自 STL 集合(例如,vector)的所有元素的下一個常見示例是:

std::vector<std::string> names = {"Albert Einstein", "Stephen Hawking", "Michael Ellis"};
for(std::vector<std::string>::iterator it = names.begin(); it != names.end(); ++it) {
    std::cout << *it << std::endl;
}