今回は《ループ制御文について学ぼう》というテーマで記事をまとめます。
「ループ制御文」まで習得すれば、プログラミングの世界がグッと拡がります。今回もしっかり学んでおきましょう。
尚、現在執筆中のC言語入門記事は以下の人を対象としています。
- プログラミング未経験の人
- C言語プログラミングの学習をこれから始めたい人
- C言語プログラミングの学習を始めたばかりの人
ループ制御文について学ぼう
「ループ制御文」とは
ループ制御文(繰り返し文)とは、決められた回数だけ処理を繰り返し実行する為の構文です。
C言語のループ制御文は、次の3つが用意されています。
- for文
- while文
- do-while文
for文
for文は『初期化処理』、『ループ継続判定処理(条件式)』、『ステップ処理』の3つで構成されます。
書式は次の2パターンになります。
for (初期化; ループ継続判定; ステップ) { 命令文; ...; }
for (初期化; ループ継続判定; ステップ) 命令文;
『初期化処理』は、for内の命令文が実行される前に1回だけ実行されます。
『ループ継続判定』は、ループ処理を継続するかどうかの判定を行う為の条件式を記述します。
『ステップ処理』は、1回のループ内処理が終わる度に1回だけ実行される処理です。
for文は次の順番で処理が実行されます。
- 初期化処理
- ループ継続判定(条件を満たす場合、3へ。満たさない場合、ループ脱出。)
- 命令文の実行
- ステップ処理
- 2~4を繰り返す
上記の説明だけでは少しわかりにくいかなと思うので、次のプログラムコードを例にfor文で実行される処理を具体的に説明したいと思います。
for (i = 0; i < 3; i++) printf("i=%d\n", i);
- 【初期化処理】 i=0 が実行される
- 【ループ継続判定】i<3 を満たすのでループ継続
- 【命令文の実行】 printf関数が実行され、画面に"i=0"が表示される
- 【ステップ処理】 i++が実行される(i が 1 となる)
- 【ループ継続判定】i<3 を満たすのでループ継続
- 【命令文の実行】 printf関数が実行され、画面に"i=1"が表示される
- 【ステップ処理】 i++が実行される(i が 2 となる)
- 【ループ継続判定】i<3 を満たすのでループ継続
- 【命令文の実行】 printf関数が実行され、画面に"i=2"が表示される
- 【ステップ処理】 i++が実行される(i が 3 となる)
- 【ループ継続判定】i<3 を満たさないのでループ終了
以上で、for文で実行される処理とその順番を概ね理解していただけたかと思います。
それでは、main関数も含めたサンプルコードを用意したので、皆さんも実行してみてください。
#include<stdio.h> void main(){ int i=0; printf("for文のサンプル実行\n"); printf("ループ前 i=%d\n",i); for (i = 0; i < 3; i++) { printf("i=%d\n",i); } printf("ループ後 i=%d\n",i); }
while文
while文はfor文と比べるとシンプルで、『ループ継続判定処理(条件式)』のみで構成されます。
書式は次のようになります。
while (ループ継続判定) { 命令文①; 命令文②; }
while (ループ継続判定) 命令文;
『ループ継続判定』にはfor文と同様、ループ処理を継続するかどうかの判定を行う為の条件式を記述します。
注意点としては、while文はfor文と違って『ステップ処理』がない為、命令文の1つに「ループを脱出する為の命令文」を記述する必要があります。そうしないと、無限ループに陥ってしまいます。
/* 無限ループの例(iが永遠に0なのでループから抜けない) */ while (i < 3) { printf("i=%d\n",i); }
それでは、while文のサンプルを用意したので、皆さんも実行してみてください。
#include<stdio.h> void main(){ int i=0; printf("while文のサンプル実行\n"); printf("ループ前 i=%d\n",i); while (i < 3) { printf("i=%d\n",i); i++; } printf("ループ後 i=%d\n",i); }
do-while文
do-while文はwhile文とほぼ同じです。
while文は『ループ継続判定処理(条件式)』が命令文の前に実行されてたのに対して、命令文の後に実行されます。つまり、「命令文が必ず1回実行される」ということです。
書式は次のようになります。
(for文やwhile文と違って { } なしで書くことはできません)
do{ 命令文①; 命令文②; } while (ループ継続判定);
do-while文のサンプルをwhile文と合わせて紹介します。
皆さんも実行してみてください。
#include<stdio.h> void main(){ int i=0; printf("do-while文のサンプル実行\n"); printf("whileループ前 i=%d\n",i); /* i == 0 なのでwhile文は実行されない */ while (i > 0 && i < 3) { printf("i=%d\n",i); i++; } printf("do-whileループ前 i=%d\n",i); /* while文と同じ条件式だが、do-while文は判定が後なので実行される */ do { printf("i=%d\n",i); i++; } while (i > 0 && i < 3); printf("do-whileループ後 i=%d\n",i); }
ループ制御をレベルアップしよう【スキップ/脱出】
continue
continueは、ループ内で処理をスキップする処理です。
continue;
通常、if文と組み合わせて使用します。
使用例として、サンプルコードを用意しました。皆さんも実行してみてください。
#include<stdio.h> void main(){ int i = 0; for(i = 0; i < 5; i++){ printf("## 1 ## i=%d\n",i); if(i > 2) continue; /* i が 2 より大きい場合はスキップされる */ printf("## 2 ## i=%d\n",i); } }
賢い皆さんなら気が付いたかもしれませんが、for文内でcontinueを実行すると次に実行されるのは『ステップ処理』なのです。(サンプルコードでも i がインクリメントされています)
当たり前ですが、while文やdo-while文の場合は『ステップ処理』がない為、continueの次に実行されるのは『ループ継続判定処理(条件式)』です。
break
switch文でも使ったことがあるbreakですが、ループ内で実行するとループを強制的に脱出します。
break;
breakもcontinue同様、通常はif文と組み合わせて使用します。
使用例として、サンプルコードを用意しました。皆さんも実行してみてください。
#include<stdio.h> void main(){ int i = 0; for(i = 0; i < 5; i++){ printf("## 1 ## i=%d\n",i); /* i が 2 より大きい場合(3の場合)はループを脱出する */ if(i > 2) break; printf("## 2 ## i=%d\n",i); } printf("## 3 ## i=%d\n",i); }
次回は関数について
今回は「ループ制御文」について学んでもらいました。プログラミングの世界がグッと拡がったでしょうか?
次回は「関数」について解説します。関数まで習得すれば、おおよそ折り返し地点を突破したといっても過言ではありません。
ご期待ください。