★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文は限定的に「多重ループから一気に脱出」にしか使わないようにしておいてください。
※「多重ループから一気に脱出」しなければならないケースもそう多くはありませんが・・・
ブラウザの戻るボタンで戻ってください。