水瓶座列車

どこまで行けるか、とりあえず発車します。

C言語の繰り返し構文( while, do while, for )の解説と応用

f:id:aquarius999:20190421195146p:plain

 

どのようなプログラミング言語でも繰り返し処理を行う構文がありますが、

ここでは、C言語の繰り返し構文について、解説していきます。

また、構文の基本以外にも、応用的な使い方についても書いていきたいと思います。

 

 

 

 

1.C言語の繰り返し構文とは

 

繰り返し構文とは、同じ処理を何回も繰り返し行いたい場合に使用します。

C言語の繰り返し構文には、

 ・while()文

 ・do while()文

 ・for()文

があります。

 

この3種類は、どれを使っても同じですが、繰り返し処理の終了条件などによって、

使いやすさがありますので、場合に応じて自分の感覚で使い分けると良いです。 

 

 

2.C言語のwhile文

 

 while文の形は、下記のようになります。

while( ここに繰り返しの終了条件を入れる ) {
  ここに処理を入れる。
};

 

まず繰り返しの終了条件を調べてから、処理を行います。

 

実際には使用すると、こんな感じです。

int iCnt = 0;
while( iCnt < 10 ) { // iCntが10以上になったら繰り返しを終了する。
  printf("カウント回数:%d\n",iCnt);
    iCnt++; // iCntをインクリメントする。
};

 

ただ、上記のような繰り返し回数が決まっている場合は、後で説明するfor文の方が使いやすいです。

私の場合、while文でよく使用するパターンは、無限ループにしておいて、処理中の条件文で、無限ループから抜けるというパターンです。

while( 1 ) {
  if( i <= 0 ) {
    break;
  }
  i--;
}

 

上記では、変数 i が、0以下になった場合に無限ループから抜けるプログラムで、

ループ回数はわからないが、ある変数が目的の値まで処理を繰り返し行いたい場合に、良く使用されます。

また、while文で、終了条件式を真(ここでは1)にすることで、無限ループになります。

ここでは、直接1としていますが、「#define FOREVER=1」として、

「while( FOREVER )」とすると無限ループであることがわかりやすくなります。

 

 

3.C言語のdo while文

 

do while文の形は、

do {
  ここに処理を入れる。
} while( ここに繰り返しの終了条件を入れる );

のように書きます。

 

例えば、こんな感じです。

int iCnt = 0;
do {
    printf("カウント回数:%d\n",iCnt);
    iCnt++;
} while( iCnt < 10 ); 

 

while文と異なる点は、繰り返しの条件を処理が終わってから調べることです。

繰り返し終了条件を先に見るか、後に見るかで、プログラムの書きやすさが変わる場合があります。

状況に応じて使い分けてみてください。 

 

 

4.C言語のfor文

 

for文は、繰り返し構文の中でもよく使われます。 

for(初期化; 繰り返し条件; 変更) {
    ここに処理を入れる
}

のように書きます。

 

例えば、こんな感じです。

for( int iCnt=0; iCnt<10, iCnt++) {
    printf("カウント回数:%d\n",iCnt);
}

 

for文は、繰り返し回数が決まっているときによく使用します。

カウント変数の初期化と繰り返し条件とカウントを一行で書くので、プログラムが見やすくなります。

基本的に、繰り返し構文のカウント変数名は、i や j 、k などが良く使用されますが、

長いプログラムになると、for文を何回も使用する場合がありますので、

他のfor文のカウント変数名と被らないように気を付ける必要があります。

また、上記のようにfor文中で、int型の宣言を行うことができます。

こうすることによって、「このfor文の処理でしかこの変数を使用しない」ことを暗黙の了解で行うことができます。

 

 

5.C言語の繰り返し構文の応用編

 

2項,3項,4項のような単純な使い方だけでなく、

システム開発での実装レベルでは、どのような使い方をしているのかを解説していきます。

 

・for文のカウンタを2つ使用する

 

for文は、カウンタを2つ使用することができます。

例えば、下記のように、cntA、cntBを同時にインクリメントしてループ処理することができます。

 

int cntB=10;
for( int cntA=0; cntA<10; cntA++,cntB++) {
    print("cntA=%d cntB=%d\n", cntA, cntB);
}

 

2次元配列を操作する時や2つの1次元配列を同時に操作する時に、

このようにすることで、簡単に処理できる場合があります。

 

 

・多重ループ

 

多重ループと言っても2重ループ、多くても3重ループまでにしておくのが良く、

それ以上の場合は、プログラム的に可読性が落ち、理解するのに時間がかかります。

ただし、数学的なプログラムなど仕方ない場合においては使用しても良いと思います。

2重ループの例として、2重for文で、変数aという2次元配列を0初期化するプログラムは、

下記のようになります。

 

int a[10][10];
for( int i=0; i<10 ; i++) {
 for( int j=0; j<10; j++) {
     a[i][j]= 0; 
 }
}

 

まだ、他にもいろいろありますが、他の人のプログラムを参考にしたり、

自分が作成するプログラムによって、どのような使い方が一番わかりやすく、

プログラムの行数が短くなるかを考えると良いです。

 

 

6.最後に

 

while()文、do while()文、for()文は、どれも同じ繰り返し処理の構文ですが、

状況によって、プログラムの書きやすさが異なります。

また、プログラムの読みやすさも変わってきますので、意識して使い分けることが大切です。

 

 

<関連・おすすめ記事>

プログラミングを独学で勉強するためのLinuxパソコン準備手順 - 水瓶座列車

RaspberryPi (ラズパイ)の購入時に最低限必要なものとおすすめセット - 水瓶座列車

Raspberry Pi (ラズパイ)で役に立つ書籍のおすすめランキングベスト5 - 水瓶座列車

C言語の演算子と優先順位の解説 - 水瓶座列車

C言語の始め方と基本構造、コンパイルから実行までを解説 - 水瓶座列車