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に比べて、使用頻度は少ないようです。

wiredBeep/topics/Programming/Lang/Cpp/n2-03 (last edited 2007-10-24 13:58:43 by beeplex)