for文 (繰り返し文) | C言語

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++) {
  ...
}
目次