for ステートメント (C++)

条件が偽 (false) になるまでステートメントを繰り返し実行します。 範囲ベースの for ステートメントの詳細については、「範囲ベースの for ステートメント (C++)」を参照してください。 C++/CLI for each ステートメントの詳細については、次inを参照してくださいfor each

構文

for ( init-expression ; cond-expression ; loop-expression )
statement

解説

指定された回数だけ実行する必要のあるループの構築に for ステートメントを使用します。

次の表に示すように、for ステートメントは 3 つのオプション部分から構成されます。

for ループ要素

構文の名前 実行タイミング 説明
init-expression for ステートメントの他の要素の前。init-expression は 1 回だけ実行されます。 その後、制御は cond-expression に渡されます。 ループ インデックスを初期化するためによく使用されます。 式または宣言を含めることができます。
cond-expression 最初のイテレーションを含む statement の各イテレーションの実行前。 statement は、cond-expression が true (0 以外) に評価された場合にのみ実行されます。 整数型に評価される式、または整数型へのあいまいでない変換が行われるクラス型。 通常、for ループの終了条件をテストするために使用します。
loop-expression statement の各イテレーションの終了時。 loop-expression の実行後に cond-expression が実行されます。 通常、ループ インデックスのインクリメントに使用します。

次の例では、for ステートメントを使用するさまざまな方法を示しています。

#include <iostream>
using namespace std;

int main() {
    // The counter variable can be declared in the init-expression.
    for (int i = 0; i < 2; i++ ){
       cout << i;
    }
    // Output: 01
    // The counter variable can be declared outside the for loop.
    int i;
    for (i = 0; i < 2; i++){
        cout << i;
    }
    // Output: 01
    // These for loops are the equivalent of a while loop.
    i = 0;
    while (i < 2){
        cout << i++;
    }
    // Output: 01
}

init-expressionloop-expression には、コンマで区切った複数のステートメントを含めることができます。 次に例を示します。

#include <iostream>
using namespace std;

int main(){
    int i, j;
    for ( i = 5, j = 10 ; i + j < 20; i++, j++ ) {
        cout << "i + j = " << (i + j) << '\n';
    }
}
/* Output:
    i + j = 15
    i + j = 17
    i + j = 19
*/

loop-expression はインクリメントまたはデクリメントするか、他の方法で変更することができます。

#include <iostream>
using namespace std;

int main(){
for (int i = 10; i > 0; i--) {
        cout << i << ' ';
    }
    // Output: 10 9 8 7 6 5 4 3 2 1
    for (int i = 10; i < 20; i = i+2) {
        cout << i << ' ';
    }
}
// Output: 10 12 14 16 18

for ループは、statement 内の breakreturn、または goto (for ループの外側のラベルが付いたステートメントに対するもの) が実行されると終了します。 for ループ内の continue ステートメントは、現在のイテレーションのみを終了します。

cond-expression を省略した場合は true と見なされ、statement 内に breakreturn、または goto がないと for ループは終了しません。

通常、for ステートメントの 3 種類のフィールドは初期化、終了のテスト、インクリメントのためによく使用されますが、これらの使用に限定されません。 たとえば、次のコードは、数値 0 ~ 4 を出力します。 この場合、statement は null ステートメントです。

#include <iostream>
using namespace std;

int main()
{
    int i;
    for( i = 0; i < 5; cout << i << '\n', i++){
        ;
    }
}

for ループと C++ 標準

C++ 標準では for ループの終了後に for ループ内で宣言された変数がスコープ外に出ることを通知します。 次に例を示します。

for (int i = 0 ; i < 5 ; i++) {
   // do something
}
// i is now out of scope under /Za or /Zc:forScope

既定では、ループ/Ze内で宣言された変数は、ループのfor外側のスコープが終了するまでforスコープ内で再メインされます。

/Zc:forScope を使用すると、for ループで宣言された変数の標準動作を指定 /Zaする必要はありません。

また、次のように、/Ze の下で変数を再宣言するために for ループのスコープの相違点を使用することも可能です。

// for_statement5.cpp
int main(){
   int i = 0;   // hidden by var with same name declared in for loop
   for ( int i = 0 ; i < 3; i++ ) {}

   for ( int i = 0 ; i < 3; i++ ) {}
}

このビヘイビアーにより、for ループで宣言された変数の標準ビヘイビアーがより正確に模倣されます。その場合、ループの終了後にスコープ外に出るために for ループで宣言された変数が必要です。 変数が for ループで宣言される場合、コンパイラは for ループの外側のスコープでローカル変数に内部的にレベルを上げます。 既に同じ名前のローカル変数がある場合でも、レベルが上げられます。

関連項目

繰り返しステートメント
キーワード
while ステートメント (C++)
do-while ステートメント (C++)
範囲ベース for のステートメント (C++)