基本制御文(反復構造: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;
}

<実行結果 VC++ Express Edition>

     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;
}

<実行結果 VC++ Express Edition>

       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
続行するには何かキーを押してください・・・

※普通に考えた場合


<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;
}

<実行結果 VC++ Express Edition>

       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
続行するには何かキーを押してください・・・

※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;
}

<実行結果 VC++ Express Edition>

       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;
}

<実行結果 VC++ Express Edition>

       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;
}

<実行結果 VC++ Express Edition>

       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文について


次へ

戻る

目次へ