C言語のwhile文とは、繰り返し同じ処理(ループ)を行うための構文です。条件式を指定して処理を繰り返しますが、複数の条件式を組み合わせたり、ネストと呼ばれる二重ループや無限ループを行うこともできます。この記事ではwhile文とdo-while文の使い方について解説します。
1.C言語のwhile文とは
while文とは、繰り返すための条件を指定して、処理を繰り返し実行することができる構文です。
2.while文の使い方
C言語のwhile文の書式、while文を使った繰り返し処理の方法と、繰り返し処理を制御する方法について解説します。
2-1.while文の書式
while文は、繰り返しの条件を「()」で囲い、繰り返し実行する処理を「{}」で囲って記述します。
次の文章はここから書き始めてください。 while (条件式) { //条件式が真の間、繰り返し実行する処理 }
while (条件式) { //条件式が真の間、繰り返し実行する処理 }
条件式は処理の開始時に毎回評価され、真の場合に繰り返しを継続し、偽の場合は繰り返しを終了します。
2-1.while文による繰り返し処理
while文では、条件式が真の間、処理が繰り返されます。
0から3まで出力する処理をwhile文で記述する例を以下に示します。
#includeint main(void){ int i=0; while (i<4) { printf(“%d\n”,i); i++; } return 0; }
実行結果は以下の通りです。
0 1 2 3
while文の実行が開始されると、条件式に従って、あらかじめ宣言され0で初期化された変数iが4より小さければ「{}」で囲われたprintf関数の処理を実行し、iのインクリメント(1加算する処理)を実行します。
そのため、iが0から3までの間、iの値を出力後にiをインクリメントする処理が繰り返されます。
while文の条件式が最初から偽の場合には、「{}」で囲われた処理は一度も実行されずに次の処理に移ります。少なくとも1回は「{}」で囲われた処理を実行したい場合は、後述のdo-while文を使用します。
while文で繰り返し実行する処理としてwhile文を記述することができます。これを二重ループといい、while文の内部にwhile文を記述することを複数回行った場合、多重ループといいます。構文の内部に同じ構文を記述しているため、入れ子やネストとも呼ばれます。
1 – 1から3 – 3まで出力する処理をwhile文の二重ループで記述する例を以下に示します。
#includeint main(void){ int i=1; int j; while(i<=3){ //while文① j=1; while(j<=3){ //while文② printf("%d - %d\n",i,j); j++; } i++; } return 0; }
実行結果は以下の通りです。
1 - 1 1 - 2 1 - 3 2 - 1 2 - 2 2 - 3 3 - 1 3 - 2 3 - 3
iが1から3までの間、while文②の処理が繰り返されます。while文②ではjが1から3までの間printf()の処理が繰り返されるため、printf関数による出力は3 x 3 = 9回実行されます。while文①の処理の最初でjを初期化することにより、iの値によらずwhile文②の処理をjが1の状態から開始しています。
while文で多重ループを使う場合、条件式や「{}」で囲われた処理で使用する変数の初期化タイミングを自分で指定する必要があり、初期化のタイミングを間違えると、意図しない値で繰り返し処理が行われますので注意してください。必要に応じて、処理の最初で必ず初期化を行うfor文と使い分けてください。
2-3.while(1)による無限ループ
while文では以下のように記述して「()」で囲われた繰り返しの条件を必ず真にすることができ、無限に処理を繰り返すことができます。
while (1) { //無限に実行する処理 }
C言語で1は真を意味しており(0は偽を意味します)、これを無限ループといいますが、処理が止まらなくなるため、あらかじめ処理を止める方法を確認してから使うようにしてください。後述するbreak句を使用すれば繰り返し処理を止めることができます。
2-4.while文の制御
C言語では、while文の「()」で囲んで記述する条件式以外でも繰り返しを制御することができます。
break句を使用すると、以降の処理を行わずにwhile文の繰り返し処理を止め、while文の後続の処理に移ることができます。
0から9まで出力するwhile文の処理をbreak句で止める例を以下に示します。
#includeint main(void){ int i=0; while (i<10) { if (i>3) { break; } printf(“%d\n”,i); i++; } printf(“end\n”); return 0; }
実行結果は以下の通りです。
0 1 2 3 end
while文に記述された条件式では、変数iが0から9までの間、iの値を出力する処理が繰り返されますが、iが4のときにbreak句が実行され、iの値を出力せずにwhile文の処理を抜けます。
continue句を使用すると、以降の処理を実行せずに次の回の処理に移る、つまりその回の処理をスキップすることができます。
1から10まで出力するwhile文の処理をcontinue句でスキップする例を以下に示します。
#includeint main(void){ int i=0; while (i<10) { i++; if (i<6) { continue; } printf(“%d\n”,i); } return 0; }
実行結果は以下の通りです。
6 7 8 9 10
while文に記述された条件式では、変数iが1から10までの間、iの値を出力する処理が繰り返されますが、iが5まではcontinue句が実行され、iの値を出力せずに次の回の処理に移ります。iのインクリメントをcontinue句の前に記述してインクリメント処理がスキップされないようにし、無限ループになることを防いでいます。
2-5.複数の条件式
while文では、条件式として複数の式をANDやOR、NOTを意味する「&&」「||」「!」といった論理演算子と組み合わせて記述することができます。
表1は論理演算子の一覧です。
演算子 | 記載例 | 説明 |
! | !a | NOT(論理否定) |
&& | a && b | AND(論理積) |
|| | a || b | OR(論理和) |
表1. 論理演算子一覧
1から3まで出力する処理を複数の条件式を使ってwhile文で記述する例を以下に示します。
#includeint main(void){ int i=1; while (i>0 && i<4) { printf(“%d\n”,i); i++; } return 0; }
実行結果は以下の通りです。
1 2 3
while文の実行が開始されると、条件式に従って、変数iが0より大きく4より小さければ「{}」で囲われたprintf関数の処理を実行し、iのインクリメント(1加算する処理)を実行します。
そのため、iが1から3までの間、iの値を出力後にiをインクリメントする処理が繰り返されます。
while文の条件式が最初から偽にならないようにiを1で初期化しています。
3.do-while文の使い方
C言語のdo-while文の書式と、while文とdo-while文の処理の違いについて解説します。
3-1.do-while文の書式
do-while文は、while文と同様に繰り返しの条件を「()」で囲い、繰り返し実行する処理を「{}」で囲って記述しますが、記述する順番がwhile文とは異なります。
do { //1回目および条件式が真の間、繰り返し実行する処理 } while (条件式);
条件式は処理の終了時に毎回評価され、真の場合に繰り返しを継続し、偽の場合は繰り返しを終了します。
3-2.do-while文による繰り返し処理
do-while文では、while文と同様に条件式が真の間、処理が繰り返されます。
0から3まで出力する処理をdo-while文で記述する例を以下に示します。
#includeint main(void){ int i=0; do { printf(“%d\n”,i); i++; } while (i<4); return 0; }
実行結果は以下の通りです。
0 1 2 3
do-while文の実行が開始されると、まず「{}」で囲われたprintf関数の処理を実行し、iのインクリメント(1加算する処理)を実行します。その後条件式に従って、変数iが4より小さければ「{}」で囲われた処理を再び実行します。
そのため、iが0から3までの間、iの値を出力後にiをインクリメントする処理が繰り返されます。
3-3.while文との違い
do-while文のwhile文との違いは、条件式が評価されるタイミングです。while文では条件式→繰り返し処理の順番で実行されるのに対し、do-while文では繰り返し処理→条件式の順番で実行されます。そのためdo-while文では、条件式に関係なく「{}」で囲われた処理が必ず1回実行されます。
4.さいごに
C言語のwhile文とdo-while文の書式、繰り返し処理の記述方法や制御方法と、while文とdo-while文の違いについて解説しました。繰り返し処理は、C言語によるプログラミングの基本となる処理のひとつです。break句, continue句を使って繰り返し行う処理の内容を変える、計算結果を条件として回数を意識せずに繰り返し計算を行う、条件を満たさなくても1回は必ず処理を行う、など様々な繰り返し処理を記述できますので、ぜひ身につけてください。