C++言語講座 第2章 3回 for文とbreak文、contunue文
for文とbreak文、contunue文
数を数える
昔、ループを作るための構文として、while文とdo~while文の二種類を作りました。ここでは三つめのループ、for文を紹介します。
まず、簡単な例として 0 ~ 9 までの数字を画面に表示するプログラムを作ってみて下さい。なに、簡単なことです。while文を使えば良いんですよね。
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 int i;
7
8 i = 0;
9 while (i < 10) {
10 cout << i << endl;
11 i++;
12 }
13
14 return 0;
15 }
i は、画面に表示する数字を格納するためのオブジェクトです。これを宣言して、
i = 0;
で、最初に画面に表示したい値 0 にしておきます。つづいて、ループを i が 9 までの間、つまり、10 未満の間ぶんまわします。ループの中では、まず、i を表示して、そして、
i++;
というふうに、i の値を 1 だけ増やしていますね。( i++ は i = i + 1 の省略だったことを思いだしてください) こうすると確かに、画面には 0 から 9 までの数字が表示されます。めでたしめでたし、です。
配列の内容表示
上の例を見て、一体何がしたいのかと不思議に思った人も居ることでしょう。というか、それがほとんどでしょうか。しかし、このように 0 からいくつかまでの数値について、同じ処理を繰り返す…というのは、どこかで役に立ちそうな処理ではあります。そう、以前説明した、配列です。
配列は、例えば、
int arr[10];
と宣言すると、arr[0] から arr[9] までの10個のオブジェクトを同時に宣言できるものでしたよね。ここでは、上で作ったプログラムを修正して、配列の中身を全て表示するようにしたいと思います。
1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 int main()
6 {
7 string arr[5] = {"Hello", "こんにちは", "Hallo", "Saluton", "Buon Giorno"};
8 int i;
9
10 i = 0;
11 while (i < 5) {
12 cout << arr[i] << endl;
13 i++;
14 }
15
16 return 0;
17 }
ちゃんと、各国語(ちなみに、英語、日本語、ドイツ語、エスペラント、イタリア語)で「こんにちは」と表示されましたよね? ここでは、文字列の配列 arr[5] を使って、ループで順に arr[i] を表示していっているわけです。
for文登場!
大体、配列を扱うときにはこのような処理は非常によく行います。いわば、C++ の会話入門番組があったら、まっさきに取り扱うような処理です。しかし、それにしては、ちょっと冗長というか、書くのが面倒です。もう少し簡単に、同じ事を書く方法は無いものでしょうか? このためにあるのが for文です。上のプログラムを for文を使って書き直してみましょう。
1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 int main()
6 {
7 string arr[5] = {"Hello", "こんにちは", "Hallo", "Saluton", "Buon Giorno"};
8 int i;
9
10 for (i = 0; i < 5; i++) {
11 cout << arr[i] << endl;
12 }
13
14 return 0;
15 }
これで、もともとのプログラムと全く同じ動きをしてくれます。だいたい、for 文のしくみがわかりますか? ちょっとややこしいですが、マスターすれば強い味方になってくれますよ。
for文の文法は以下の通り。
for (初期化式; 条件式; 処理2) 処理1
これは、while文で以下のように書くのと、同じ処理をしてくれます。
初期化式;
while (条件式) {
処理1
処理2;
}
つまり、順番に書くと、
初期化式を実行(最初に一回だけ)
→条件式をチェック→処理1を実行→処理2を実行
→条件式をチェック→…
という事です。
初期化式と条件式後の ; を忘れないように。
break文
まだ、ループの途中で、条件式が真か偽かに関わらず、急にループから抜けなくてはならないときがあります。そんなときに使うのが、break文です。
ちょっとわかりにくいでしょうか? たとえば、上の例でいくと、プログラマがエスペラントとイタリア語が嫌い(笑)で、Hallo まで表示したところで、もう forループはやめて、ループから抜け出したい、処理を終わりたいとします。すると、このように書けば良いのです。
1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 int main()
6 {
7 string arr[5] = {"Hello", "こんにちは", "Hallo", "Saluton", "Buon Giorno"};
8 int i;
9
10 for (i = 0; i < 5; i++) {
11 if (arr[i] == "Saluton")
12 break; // もう、ループは抜ける!
13 cout << arr[i] << endl;
14 }
15
16 cout << "へっへ、もうループはぬけたもんね" << endl;
17
18 return 0;
19 }
つまり、break と書いたところで、forループを終了して、それ以降の処理はしないのです。break文は、for だろうと while だろうと do~while だろうと、一番内側のループを強制的に終了します。複雑なプログラムを書くようになると、なかなか重宝します。
continue文
continue文はbreak文と同じように使い、そのループの最初から処理をやりなおすことを意味しています。つまり、
while (・・・) {
// ※
…
continue;
…
}
このようなプログラムの場合、continue を実行したところで、次は※の行を実行するというわけです。
面白いのは for文と一緒に使ったときです。上のプログラムだと、continue をしたとしても、ちゃんと i++ は実行されるのです。ちょっとみてみましょう。例えばプログラマが、エスペラントは嫌いだけれどイタリア語は好きなとき(笑)を考えましょう。
1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 int main()
6 {
7 string arr[5] = {"Hello", "こんにちは", "Hallo", "Saluton", "Buon Giorno"};
8 int i;
9
10 for (i = 0; i < 5; i++) {
11 if (arr[i] == "Saluton")
12 continue; // Salutonはとばす!
13 cout << arr[i] << endl;
14 }
15
16 cout << "ループ終わり!" << endl;
17
18 return 0;
19 }
つまり、forループの中でcontinueを使うと、その回のループをとばすような処理ができるわけですね。
continue文はbreakに比べて、使用頻度は少ないようです。
