for文は指定した回数処理を繰り返す、if文と並び最も基本となる制御文の1つです。条件を満たす間処理を繰り返し実行するという使い方で、下記はそのもっとも単純な例です。
[基本形]
for (初期化式; 継続条件式; 変化式) {
...
}
[例]
for (i = 0; i < 10; i++) {
// iを0~9まで10回繰り返す
}
項目 | 内容 |
---|---|
初期化式 | 初期化式はfor文の開始時に一度だけ実行します。 |
継続条件式 | ループの開始時に評価し、条件式を満たす場合はブロック内の処理を実行します。条件式を満たさない場合は、for文を抜けて次の処理へ進みます。 |
変化式 | ループの最後で実行し、主に条件式で使用する変数を増減させます。 |
目次
各式は省略できる
初期化式、継続条件式、変化式はそれぞれ省略することができます。この仕様を用いることで、少し特殊な処理を実装することができます。例えば初期化式を省略することで、下記のようなことができます。
// "i < 9"なら処理を実行する
for (; i < 10; i++) {
...
}
また継続条件式を省略することで無限ループを作り出すこともできます。
for (;;) {
// breakで抜けない限り永遠に繰り返す
}
break句
break句を用いることで、繰り返しの途中でfor文を抜けることができます。
for (i = 0; i < 10; i++) {
if (a[i] == NULL) {
break;
}
}
ただしbreak句で抜け出せるのは内側1つのループのみです。多重ループから抜け出すためには、下記のようなことを行います。
[例1]
signed char flag = 0;
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (a[i][j] == NULL) {
flag = 1;
break;
}
}
if (flag == 1) {
break;
}
}
[例2]
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (a[i][j] == NULL) {
goto LOOP_END;
}
}
LOOP_END:
}
continue句
continue句を使うと、ブロック内のそれ以降の処理をスキップしてループの先頭に戻ります。
for (i = 0; i < 10; i++) {
// [A]
if (a[i] != 'A') {
// [B]に進まず[A]に戻る
continue;
}
// [B]
...
}
注意点
for文を使用する際は、次のことに気を付けてください。
- 継続条件式を「=」で判定しない。
-
下記の例は通常であればどちらも同じ動きをします。しかし誤作動によりiが11以上になったとき、適合例の方は速やかにループを抜けることができます。
[不適合例]
for (i = 0; i = 10; i++)
[適合例]
for (i = 0; i <= 10; i++)
- ブロック内で変化式で使用する変数を操作しない。
-
ブロック内で変数を操作するとコードの見通しが悪くなり、保守性が低下します。
[不適合例]
for (i = 0; i <= 10; i++) { i++; }
- ループカウンターと継続条件式に使用する変数は、同じ型にする。
-
型のサイズが異なると無限ループに入ってしまう恐れがあります。
[不適合例]
signed char i; int num; // numがsigned char型で表せられない値の場合 // 無限ループに入る for (i = 0; i < num; i++) { ... }
[適合例]
int i; int num; for (i = 0; i < num; i++) { ... }