★基本制御文(反復構造:for5)★


for文におけるbreakの扱いは、while文のそれと同じです。


<sample program 059-01>

#include <stdio.h>

int main(void)
{
    int i;

    for (i = 0; i < 10; i++) {
        printf("Hello\n");
        break;
    }

    return 0;
}

<実行結果>

Hello
続行するには何かキーを押してください・・・

breakと書くと、ループから抜けますので、上記のプログラムは1回しか「Hello」と表示されません。

for文は「繰り返し回数が決まっている場合使用すると良い」と何度も書きましたが、途中でループを抜けたい場合もあります。

そのような時にbreakを使えば良いでしょう。


続いてbreakを使って多重ループから抜け出すことを考えてみましょう。

次のプログラムは二重ループを使ったプログラムです。


<sample program 059-02>

#include <stdio.h>

int main(void)
{
    int i;
    int j;

    for (i = 2; i < 10; i++) {
        for (j = 2; j < 10; j++) {
            printf("%3d", i * j);
        }
        printf("\n");
    }

    return 0;
}

<実行結果>

  4  6  8 10 12 14 16 18
  6  9 12 15 18 21 24 27
  8 12 16 20 24 28 32 36
 10 15 20 25 30 35 40 45
 12 18 24 30 36 42 48 54
 14 21 28 35 42 49 56 63
 16 24 32 40 48 56 64 72
 18 27 36 45 54 63 72 81
続行するには何かキーを押してください・・・

このプログラムは九九の表を表示するプログラムです。

今は九の段まで表示されていますが、五の段までしか表示しない場合を考えます。


まずは、breakを使わない場合、次のようになります。


<sample program 059-03-1>

#include <stdio.h>

int main(void)
{
    int i;
    int j;

    for (i = 2; i < 6; i++) {
        for (j = 2; j < 10; j++) {
            printf("%3d", i * j);
        }
        printf("\n");
    }

    return 0;
}

<実行結果>

  4  6  8 10 12 14 16 18
  6  9 12 15 18 21 24 27
  8 12 16 20 24 28 32 36
 10 15 20 25 30 35 40 45
続行するには何かキーを押してください・・・

外側のループが「段」を表しているので、繰り返し条件の数値を10から6に変えました。


では(ちょっと強引ですが)breakを使った場合の例を書きます。


<sample program 059-03-2>

#include <stdio.h>

int main(void)
{
    int i;
    int j;

    for (i = 2; i < 10; i++) {
        
        for (j = 2; j < 10; j++) {
            printf("%3d", i * j);
        }
        
        printf("\n");
        
        if (i == 5) {
            break;
        }
    }

    return 0;
}

<実行結果>

  4  6  8 10 12 14 16 18
  6  9 12 15 18 21 24 27
  8 12 16 20 24 28 32 36
 10 15 20 25 30 35 40 45
続行するには何かキーを押してください・・・

変数iは2から10より小さい間繰り返すようになっていますが、「改行」を表示した後にif文があります。

もし、iが5であれば強制的にループを抜けるようになっていますので、5の段までしか表示されません。


では、次も無理やりな例かもしれませんが、上の九九のプログラムを使って、「5*5」まで表示したらすべてのループを抜けて終わるように変更してみます。

「5*5」の計算はiが5でjが5の時に行われます。

そこで、次のように変更してみます。


<sample program 059-04>

#include <stdio.h>

int main(void)
{
    int i;
    int j;

    for (i = 2; i < 10; i++) {
        for (j = 2; j < 10; j++) {
            
            printf("%3d", i * j);
            
            if (i == 5 && j == 5) {
                break;
            }
        }
        printf("\n");
    }

    return 0;
}

<実行結果>

  4  6  8 10 12 14 16 18
  6  9 12 15 18 21 24 27
  8 12 16 20 24 28 32 36
 10 15 20 25
 12 18 24 30 36 42 48 54
 14 21 28 35 42 49 56 63
 16 24 32 40 48 56 64 72
 18 27 36 45 54 63 72 81
続行するには何かキーを押してください・・・

確かに5の段は「5*5」で終わっていますが、6の段以降も表示されています。

なぜでしょうか。

以前にも少し書きましたが、breakはwhileやswitchから抜け出すためにあるものです。

しかし、1つのbreakで抜けれる命令(ブロック)は1つです。

上のプログラムの場合、内側のfor文は抜けていますが、外側のfor文は抜けられないのです。

もし、内側と外側を同時に抜けようとすると次のようなプログラムになります。


<sample program 059-05>

#include <stdio.h>

int main(void)
{
    int i;
    int j;

    for (i = 2; i < 10; i++) {
        for (j = 2; j < 10; j++) {
            
            printf("%3d", i * j);
            
            if (i == 5 && j == 5) {
                break;
            }
        }
        printf("\n");

        if (i == 5 && j == 5) {
            break;
        }
    }

    return 0;
}

<実行結果>

  4  6  8 10 12 14 16 18
  6  9 12 15 18 21 24 27
  8 12 16 20 24 28 32 36
 10 15 20 25
続行するには何かキーを押してください・・・

内側と外側のループを同時に抜けたい場合、抜け出すための条件を2回書かなければなりません。

これは、while文でも同じことが言えますし、whileとforのネスト(入れ子)でも同じです。

初心者の方がよく陥る間違いですので、しっかりと覚えておいてください。


最後に上記の問題(抜け出すための条件を2回書かなければならない)を解消するための命令について書いておきます。

goto文について


次へ

戻る

目次へ