名前空間
変種
操作

for ループ

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
for
range-for (C++11)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (非推奨)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
ラベル
label : statement
式文
expression ;
複合文
{ statement... }
選択文
if
switch
繰り返し文
while
do-while
for
範囲 for(C++11)
ジャンプ文
break
continue
return
goto
宣言文
declaration ;
try ブロック
try compound-statement handler-sequence
トランザクショナルメモリ
synchronized, atomic_commit など(TM TS)
 

init-statement 一度実行し、その後 condition の値が false になるまで statementiteration_expression を繰り返し実行します。 テストは各反復の前に行われます。

目次

[編集] 構文

    正式な構文:
attr(オプション) for ( init-statement condition(オプション) ; iteration_expression(オプション) ) statement
    非正式な構文:
attr(オプション) for ( declaration-or-expression(オプション) ; declaration-or-expression(オプション) ; expression(オプション) ) statement
attr(C++11) - 任意の個数の属性
init-statement - 以下のいずれか。
  • 式文 (空文 ";" でも構いません)。
  • 単純宣言。 一般的には初期化子付きのループカウンタ変数の宣言ですが、好きなだけ多くの変数を宣言しても構いません。
あらゆる init-statement はセミコロン ; で終わらなければならないことに注意してください。 これが式または宣言にセミコロンが続いたものとしてしばしば非形式的に説明される理由です。
condition - 以下のいずれか。
  • bool に文脈的に変換可能。 この式は各反復の前に評価され、それが false になれば、ループは終了します。
  • 波括弧または等号初期化子付きの単一の変数の宣言。 初期化子は各反復の前に評価され、その宣言された変数の値が false に変換されれば、ループは終了します。
iteration_expression - 任意の。 ループの各反復の後、 condition がもう一度評価される前に実行されます。 一般的にはループカウンタをインクリメントする式です。
statement - 任意の。 一般的には複文であり、ループの本体となります。

[編集] 説明

上の構文は以下と同等なコードになります。

{
init_statement
while ( condition ) {
statement
iteration_expression ;
}

}

ただし以下の点が異なります。

1) init-statement で宣言された名前 (init-statement が宣言であった場合) と condition で宣言された名前 (condition が宣言であった場合) は同じスコープです (これは statement のスコープでもあります)。
2) statement 内の continueiteration_expression を実行します。
3) 空の conditionwhile(true) と同等です。

ループの実行をどこかの点で終了する必要がある場合は、 break 文を終了文として使用できます。

ループの実行をループ本体の終わりから続ける必要がある場合は、 continue 文をショートカットとして使用できます。

while ループの場合と同様に、 statement が単一の文である (複文でない) 場合、その中で宣言された変数のスコープは複文であったかのようにループ本体に制限されます。

for (;;)
    int n;
// この時点で n はスコープ外です。

[編集] キーワード

for

[編集] ノート

C++ の前方進行保証の一部として、観察可能な動作を持たない (入出力関数を呼んだり、 volatile オブジェクトにアクセスしたり、アトミック操作や同期操作行ったりしない) ループが終了しない場合、動作は未定義です。 コンパイラはそのようなループを削除することが許されています。

C++ では init-statement のスコープと statement のスコープはひとつであり同じものですが、 C では statement のスコープは init-statement のスコープ内にネストされます。

for (int i = 0; ; ) {
    long i = 1;   // C では有効、 C++ では無効
    // ...
}

[編集]

#include <iostream>
#include <vector>
 
int main()
{
    // 本体として単一の文を持つ一般的なループ
    for (int i = 0; i < 10; ++i)
        std::cout << i << ' ';
    std::cout << '\n';
 
    // init-statement は、同じ decl-specifier-seq を使用できる限り、
    // 複数の名前を宣言できます。
    for (int i = 0, *p = &i; i < 9; i += 2) {
        std::cout << i << ':' << *p << ' ';
    }
    std::cout << '\n';
 
    // condition は宣言でも構いません。
    char cstr[] = "Hello";
    for (int n = 0; char c = cstr[n]; ++n)
        std::cout << c;
    std::cout << '\n';
 
    // init-statement で auto 型指定子を使用できます。
    std::vector<int> v = {3, 1, 4, 1, 5, 9};
    for (auto iter = v.begin(); iter != v.end(); ++iter) {
        std::cout << *iter << ' ';
    }
    std::cout << '\n';
 
    // init-statement は式でも構いません。
    int n = 0;
    for (std::cout << "Loop start\n";
         std::cout << "Loop test\n";
         std::cout << "Iteration " << ++n << '\n')
        if(n > 1)
            break;
    std::cout << '\n';
}

出力:

0 1 2 3 4 5 6 7 8 9 
0:0 2:2 4:4 6:6 8:8 
Hello
3 1 4 1 5 9 
Loop start
Loop test
Iteration 1
Loop test
Iteration 2
Loop test

[編集] 関連項目

範囲 for ループ 範囲に対してループを実行します (C++11およびそれ以降) [edit]