同じ処理の繰り返しが必要な場合に使用します。
繰り返し処理の書き方は複数ありますが、ここではfor文の使い方を説明します。
また、繰り返し実行することをループと言います。
for文基本
for文の書き方は以下となります。
for (初期化式;条件式;更新式)
実行する処理;
(初期化式)
for文はまず最初に初期化式を一度だけ実行します。
(条件式)
判定結果が真の場合に「実行する処理」を実行します。
(更新式)
「実行する処理」の実行が終わると変化式が実行されます。
サンプルを見てみましょう。
int i;
for(i=0; i<3; i++)
printf("%d回目のループです\n", i + 1);
説明します。
(初期化式)
最初に i=0 を実行します。
(条件式)
i<3 の場合には、「実行する処理」である printf文を実行します。
i=3 は実行されません。
(更新式)
printf文の実行が終わったら、i++ を実行します。
i=0 の実行が終わったら、i++が実行されて i=1 になります。
ですから、このfor文では i=0 i=1 j=2 のときにprintf文が実行されます。
以下が実行結果です。
#include <stdio.h>
int main()
{
int i;
for(i=0; i<3; i++)
printf("%d回目のループです\n", i + 1);
}
実行結果
0回目のループです
1回目のループです
2回目のループです
次の例を見てください。
for(int i=0; i<3; i++) {
printf("%d回目のループです\n", i + 1);
}
forのカッコ内で変数を宣言すると、その変数はfor文の中でのみ使用できます。
for文の{}が終了すると、その変数は使用できなくなります。
次の例は複数の文を実行する例です。
#include <stdio.h>
int main()
{
int a;
for(a=2; a<=10; a+=2) { /* a+=2 は a=a+2 と同じ */
printf("a=%d\n", a);
printf(" これは偶数です\n");
}
}
実行結果
a=2
↑これは偶数です
a=4
↑これは偶数です
a=6
↑これは偶数です
a=8
↑これは偶数です
a=10
↑これは偶数です
下のような書き方になります。
for (初期化式;条件式;更新式)
実行する処理;
実行する処理;
実行する処理;
}
for文2重ループ
2重ループの使い方です。3重、4重も同様です。
#include <stdio.h>
int main()
{
for (int x=1; x<=3; x++) {
for (int y=10; y<=30; y+=10) {
printf("x=%d y=%d x+y=%d\n", x, y, x+y);
}
}
}
実行結果
x=1 y=10 x+y=11
x=1 y=20 x+y=21
x=1 y=30 x+y=31
x=2 y=10 x+y=12
x=2 y=20 x+y=22
x=2 y=30 x+y=32
x=3 y=10 x+y=13
x=3 y=20 x+y=23
x=3 y=30 x+y=33
for文無限ループ
無限ループの使い方は以下の書き方です。
for (;;) {
実行する処理;
}
初期化式、条件式、更新式がすべてありません。これは無限ループです。
このままではプログラムが永遠に終了しないため、次に説明するbreakによって終了させます。
break文
break文はfor文の実行を中止します。
#include <stdio.h>
int main()
{
int i=0;
for (;;) {
i++;
if(i >= 3) {
printf("終了します\n");
break;
}
printf("for %d回目の処理\n", i);
}
printf("処理が終了しました\n");
}
実行結果
for 1回目の処理
for 2回目の処理
終了します
処理が終了しました
この使い方は、for文を実行する時点では何回繰り返すか分からない場合です。
for文内で何らかの処理を行ったときに、終了条件が判明したらbreakで終了するということです。
上の例では、 i>=3 で break して、for文を抜け出ます。
continue文
continue文は処理をスキップします。
次の例を見てください。
#include <stdio.h>
int main()
{
for (int i = 0; i < 5; i++) {
printf("i for文の下 i=%d です\n", i);
if(i<2) {
/* 処理が不要なためスキップ */
printf("continue文の前です\n");
continue;
}
printf("if文の下 i=%d です\n", i);
}
printf("処理が終了しました \n");
}
実行結果
i for文の下 i=0 です
continue文の前です
i for文の下 i=1 です
continue文の前です
i for文の下 i=2 です
if文の下 i=2 です
i for文の下 i=3 です
if文の下 i=3 です
i for文の下 i=4 です
if文の下 i=4 です
処理が終了しました
この使い方は、for文の中で処理したくない、処理をスキップしたいという場合に
continue文を使ってスキップします。
continue文を実行すると、continue文の下方の文は処理をせずにfor文のすぐ下の行に行きます。
実行結果の出力をみてください。
「if文の下 i=2 です」
i=0, i=1の場合はこのprintfが無いことに注意してください。
スキップされています。
次の例を見てください。
2重ループの場合です。
この場合 continue するとどこに行くのでしょう。
int main()
{
for (int k=0; k<2; k++) {
printf("k for文の下 i=%d です\n", k);
for (int i = 0; i < 4; i++) {
printf("i for文の下 i=%d です\n", i);
if(i<2) {
/* 処理が不要なためスキップ */
printf("continue文の前です\n");
continue;
}
printf("if文の下 i=%d です\n", i);
}
printf("処理が終了しました k=%d \n", k);
}
}
実行結果
k for文の下 i=0 です
i for文の下 i=0 です
continue文の前です
i for文の下 i=1 です
continue文の前です
i for文の下 i=2 です
if文の下 i=2 です
i for文の下 i=3 です
if文の下 i=3 です
処理が終了しました k=0
k for文の下 i=1 です
i for文の下 i=0 です
continue文の前です
i for文の下 i=1 です
continue文の前です
i for文の下 i=2 です
if文の下 i=2 です
i for文の下 i=3 です
if文の下 i=3 です
処理が終了しました k=1
continue を実行すると「i for文の下 i=1 です」に行きます。
2重ループの場合の continue は、自分の属している {} のfor文に戻ります。
break も同様です。
コメント