[PR]解禁!サクラのいない直メなび:※男女タダで遊べる、大人のためのコミュ


★goto文について★


このコラムでは、goto文について書きます。

多重ループからbreakを使って抜け出す際に、同じ条件を2回書かなければならないことを解消するため、goto文を紹介するのですが、このgoto文は非常に危険な命令ですので、色々と注意事項を書きながら進めていきます。

まずは文法です。


・goto文の文法

goto ラベル名;

これで、自分が設定したラベル名の部分へジャンプ(実行する行を移動すること)します。

ラベルの書き方は、

ラベル名: ← コロンです!間違えないように!

です。

1つサンプルを書いてみます。


<sample program col023-01>

#include <stdio.h>

int main( void )
{
    printf( "Program Start\n" );

    goto LABEL;

    printf( "Hello\n" );

LABEL:

    printf( "Program End\n" );

    return 0;
} 

<実行結果 VC++ Express Edition>

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

goto文の後ろにジャンプ先のラベル(LABEL)を書きました。

このLABELという単語は特に意味はありません、皆さんが自由につけて良い名前です。

少し下の行に

LABEL:

という記述が見えます。

goto文が実行されると、この場所にジャンプします。

今回のプログラムでは、goto文とラベルの間の文、

printf( "Hello\n" );

が実行されていません。

これはgoto文によってプログラムの実行がジャンプ(飛び越)されたからです。

このように、gotoとラベルの組み合わせで、自分の好きな箇所へジャンプさせることができるのです。

これを使って、多重ループから抜け出してみます。

< sample program 059-05 >の書き換えです。


<sample program col023-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 );
            if( i == 5 && j == 5 ) {
                goto LABEL;
            }
        }
        printf( "\n" );
    }

LABEL:

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

iとjが5になった場合、goto文を使って一気に二重ループを抜け出します。

この形だと、同じような条件を2回も書かずに済みます。

※改行が実行されていないため、表示は少しおかしいですが・・・

このように、多重ループから一気に抜け出したい場合goto文は役に立ちます。


しかし、多くのプロジェクト等では、goto文は絶対に使ってはならない等の措置が取られています。

便利な命令ですが、なぜでしょうか?

これには、次のような理由があります。

・goto文を多用(悪用)するとプログラムが見づらくなり、デバッグが非常に難しくなる

例えば、次のプログラムが何を行っているか考えてみてください。


<sample program col023-03>

#include <stdio.h>

int main( void )
{
    int i;

    i = 0;

LOOP:

    printf( "Hello\n" );

    i++;

    if( i >= 5 ) {
        goto EXIT;
    }

    goto LOOP;

EXIT:

    return 0;
}

これは、下のプログラムをfor文を使わずに書いた例です。


<sample program col023-04>

#include <stdio.h>

int main( void )
{
    int i;

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

    return 0;
}

<実行結果 VC++ Express Edition>

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

どちらが分かりやすいか、すぐに分ると思います。

ただ、このような例はまだ分かりやすいケースで、goto文を多用したプログラムはもっと悪質です。

当面はgoto文は限定的に「多重ループから一気に脱出」にしか使わないようにしておいてください。

「多重ループから一気に脱出」しなければならないケースもそう多くはありませんが・・・


ブラウザの戻るボタンで戻ってください。


[PR]生年月日で2010年運命占い:初回無料!貴女の悩みを占い師に相談