for ループ
提供: cppreference.com
init-statement 一度実行し、その後 condition の値が false になるまで statement と iteration_expression を繰り返し実行します。 テストは各反復の前に行われます。
構文
| 正式な構文: | |||||||||
attr(オプション) for ( init-statement condition(オプション) ; iteration_expression(オプション) ) statement
|
|||||||||
| 非正式な構文: | |||||||||
attr(オプション) for ( declaration-or-expression(オプション) ; declaration-or-expression(オプション) ; expression(オプション) ) statement
|
|||||||||
| attr(C++11) | - | 任意の個数の属性。 |
| init-statement | - | 以下のいずれか。
|
| condition | - | 以下のいずれか。 |
| iteration_expression | - | 任意の式。 ループの各反復の後、 condition がもう一度評価される前に実行されます。 一般的にはループカウンタをインクリメントする式です。 |
| statement | - | 任意の文。 一般的には複文であり、ループの本体となります。 |
説明
上の構文は以下と同等なコードになります。
{
|
|||||||||
ただし以下の点が異なります。
1) init-statement で宣言された名前 (init-statement が宣言であった場合) と condition で宣言された名前 (condition が宣言であった場合) は同じスコープです (これは statement のスコープでもあります)。
3) 空の condition は
while(true) と同等です。ループの実行をどこかの点で終了する必要がある場合は、 break 文を終了文として使用できます。
ループの実行をループ本体の終わりから続ける必要がある場合は、 continue 文をショートカットとして使用できます。
while ループの場合と同様に、 statement が単一の文である (複文でない) 場合、その中で宣言された変数のスコープは複文であったかのようにループ本体に制限されます。
for (;;)
int n;
// この時点で n はスコープ外です。
キーワード
ノート
C++ の前方進行保証の一部として、観察可能な動作を持たない (入出力関数を呼んだり、 volatile オブジェクトにアクセスしたり、アトミック操作や同期操作行ったりしない) ループが終了しない場合、動作は未定義です。 コンパイラはそのようなループを削除することが許されています。
C++ では init-statement のスコープと statement のスコープはひとつであり同じものですが、 C では statement のスコープは init-statement のスコープ内にネストされます。
for (int i = 0; ; ) {
long i = 1; // C では有効、 C++ では無効
// ...
}
例
Run this code
#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)
|
範囲に対してループを実行します |
for の C言語リファレンス
| |