C言語

for文のネスト

for文のブロック内に、さらにfor文を書くことをfor文のネスト(入れ子)といいます。
ここでは、for文の中で別のfor文を使う方法について説明します。

ネストとは

ネストとは、入れ物と中に入れ物を入れるようなイメージで、for文やif文などの文の中に、さらに文を入れるという意味です。
例えば、for文のブロック内にif文を書いたり、if文のブロック内にさらにif文を書いたり、さまざまな形のネストがあります。

今回は、その中でfor文のネストについて説明します。

for文のネストの仕組み

実際にプログラムを動かしてみると、ネストの動きを理解しやすいです。
次のプログラムを実行して結果を確認してみましょう。

#include <stdio.h>

int main(void)
{
  int i;
  int j;
  
  for(i = 1; i <= 5; i++) {
    for(j = 1; j <= 3; j++) {
      printf("i=%d,j=%d ", i, j);
    }
    printf("\n");
  }
  return 0;
}

次にプログラムの実行結果です。

i=1,j=1 i=1,j=2 i=1,j=3
i=2,j=1 i=2,j=2 i=2,j=3
i=3,j=1 i=3,j=2 i=3,j=3
i=4,j=1 i=4,j=2 i=4,j=3
i=5,j=1 i=5,j=2 i=5,j=3

動作の流れ

  1. 外側の for(i = 1; i <=5; i++) が実行されます。
    このとき、i1 です。
  2. 次に内側の for(j = 1; j <= 3; j++) が実行されます。
    j は1から3まで変化しながら、 printf("i=%d,j=%d ", i, j); が3回実行されます。
  3. j が4になると条件が偽になり、内側のfor文を抜けます。
    その後、 printf("\n"); の実行により、改行されます。
  4. 外側のfor文に戻り、 i1 増えて(2になる)、再び内側のfor文が実行されます。
  5. これを5回まで繰り返します。

つまり、外側のfor文は、「行(i)」を制御(1行ずつ進める)し、内側のfor文は「列(j)」を制御(1列ずつ進める)しています。
このように、for文をネストすると2重の繰り返し処理(行毎に例を繰り返すような処理)が実現します。
例えば、九九を表示したりすると分かりやすいかもしれません。

九九の結果を表示するプログラムです。

#include <stdio.h>

int main(void)
{
  int i;
  int j;
  
  for(i = 1; i <= 9; i++) {
    for(j = 1; j <= 9; j++) {
      printf("%d ", i*j);
    }
    printf("\n");
  }
  return 0;
}

実行結果

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

まとめ

  • ネストとは、文の中に別の文を入れることをいう
  • for文の中でさらにfor文を書くことを、for文のネストという
  • 外側のfor文が1回実行されるごとに、内側のfor文はすべての回数を繰り返す
  • 外側のfor文は「大きな繰り返し」、内側のfor文は「その中の細かい繰り返し」を担当する
  • for文をネストすると、「行ごとに列を処理する」「組み合わせを順に処理する」ようなプログラムを作れる

-C言語