for文「3つの式で繰り返し制御!」 | 技術者が教える初心者さんのためのC言語

技術者が教える初心者さんのためのC言語

〜最小限の知識でプログラム〜

いつも感謝しています。Nです。

while文「~の間は繰り返す」で、「構造化定理」(順次、選択、繰り返し)というものがあるとお話しました。

「構造化定理」とは、プログラムのアルゴリズムは3つの基本ロジック(順次、選択、繰り返し)を組み合わせることで、全て書けてしまうというものでした。

今日は、”繰り返し”の中でも最もプログラムでよく使うfor文について、お話したいと思います。

このfor文は、まだ説明していませんが配列、構造体といったものと組み合わせて使うことで構造化プログラムというものを行うときに、非常に便利です。

構造化プログラムについては、また別の機会にお話したいと思います。

ここでは、for文というのは、繰り返し処理の中でもよく使うし、また構造化プログラムというものをするときにも後々重要になってくるんだなぁ、と押さえておいてくださいね。

では、具体的にfor文の基本についてお話していきます。

まず、for文では

3つの式で繰り返しを制御するんだ!

ということを押させておくことが重要です。

for文の基本型を書くと、

for( 初期化;継続条件;変化  )
{
 繰り返し処理;
}

のようになります。

うーん、「初期化式」「継続条件式」「変化式」難しい用語ですね。

要は、簡単に言うとfor文は、

forの後に続く( )の中のセミコロン(;)で区切られた3つの式で、{  }の中の繰り返し処理を
実行する
ものだということです。

非常に簡単な、サンプルプログラムを用いながら説明しますね。

int   main(  void  )
{
   int   a;

   for( a = 0;  a < 3;  a++ )
  {
       printf("a=%d¥n", a );
   }

   return( 0 );
}

実行結果:
a=0
a=1
a=2

この場合、"a = 0", "a < 3", "a++"という3つの式で、繰り返し処理"printf("a=%d¥n", a );"を実行するということになります。

( )の中の左の式 "a = 0" の部分は、for文の実行時に、はじめの1回だけ実行されます。
つまり、「aという変数を0に初期化しなさい」という意味になります。

( )の中の真ん中の式 "a < 3"の部分は、「この条件式が成立している間は、繰り返し処理を実行しなさい」という意味になります。

( )の中の右の式 "a++"の部分は、「1回繰り返し処理が終わる毎にこの式を実行しなさい」という意味になります。

つまり、

   for( a = 0;  a < 3;  a++ )
  {
       printf("a=%d¥n", a );
   }

の部分をステップに分解して説明すると、

Step0:初期化式 (a = 0;)を実行する(1回だけ)
Step1:継続条件式 (a < 3;) の条件が成立しているか判断する
    条件が成立している場合は、Step2へ進む
    条件が成立していない場合は、for文終了
Step2:成立しているならば、繰り返し処理文(printf文)を実行する
Step3:成立しているならば、変化式 (a++)を実行する
Step4:Step1へ戻る

a = 0;

a = 0 ・・・・・a < 3 OK
a = 0を表示
a++を実行・・・a = 1

a = 1・・・・・ a < 3 OK
a = 1を表示
a++を実行・・・a = 2

a = 2・・・・・ a < 3 OK
a = 2を表示
a++を実行・・・a = 3

a = 3・・・・・ a < 3 NG
→ for文終了

のようになります。


ここで、理解をよく間違えてしまう点として、上記の「Step3:成立しているならば、変化式 (a++)を実行する」の部分です。


つまり、このサンプルプログラムにおいて、for文を抜けた後のaの値は3になっているということです。

これを理解するために、次のサンプルプログラムを実行してみてください。

int   main(  void  )
{
   int   a;

   for( a = 0;  a < 3;  a++ )
  {
       printf("a=%d¥n", a );
   }

   printf(" Final a = %d¥n", a);
   return( 0 );
}

実行結果:
a=0
a=1
a=2
Final a = 3

この例で言うと、「for文を抜けた後のaの値は3なのに、2だ」と非常に勘違いしやすい人が多いです。これは潜在的バグになる可能性がありますので注意してくださいね。

では、もう二つほど例を出しておきますね。

◆1つ目の例

int   main(  void  )
{
   int   a;

   for( a = 0;  a <= 2;  a++ )
  {
       printf("a=%d¥n", a );
   }

   printf(" Final a = %d¥n", a);
   return( 0 );
}

◆2つ目の例

int   main(  void  )
{
   int   a;

   for( a = 5;  a < 3;  a++ )
  {
       printf("a=%d¥n", a );
   }

   printf(" Final a = %d¥n", a);
   return( 0 );
}


この各々の場合のFinal aの値は、何になるでしょうか?実際にプログラムを書いて実行して確かめてくださいね。