[BASICのはじめ方] Part8: GOTOとGOSUB、RETURNの使い方

こんにちは!BASICの学習、順調に進んでいますか? 前回は条件分岐や繰り返し処理を学びましたね。今回は、プログラムの流れを制御するもう一つの方法、GOTOGOSUBRETURN について学びましょう。

注意点

GOTO 文はプログラムの流れを直接的に変える強力な命令ですが、多用するとプログラムの構造が複雑になり、読みにくく、デバッグしにくい「スパゲッティコード」と呼ばれる状態になりがちです。現代的なプログラミングでは、IF文やFOR文、WHILE文などの構造化された制御構文を使うことが推奨されます。GOSUBも同様に、より新しいSUBFUNCTION(後のステップで学びます)を使った方が分かりやすいコードになります。
ここでは、古いBASICコードを理解するためや、特定の状況での使い方を学ぶ目的で解説します。

GOTO文:指定した場所へジャンプ

GOTO 文は、プログラムの実行を指定した「ラベル」または「行番号」に強制的に移動させます。

構文:

GOTO ラベル名
' または
GOTO 行番号

ラベルは、通常、行の先頭に記述され、コロン(:)で終わります(例: MyLabel:)。行番号は、古いBASICで使われていたもので、各行の先頭に番号を振っていました。

例:

10 PRINT "無限ループに入ります..."
20 GOTO 10 ' 行番号10へジャンプする
' ラベルを使った例 (QBasicなど)
PRINT "Start"
GOTO SkipSection
' この部分は実行されない
PRINT "ここはスキップされます。"
SkipSection:
PRINT "ここにジャンプしました!"
END

最初の例では、行番号20が実行されると、無条件に行番号10に戻るため、無限ループになります。(実行を止めるには Ctrl+C など、環境に応じた中断操作が必要です)。

ラベルを使った例では、GOTO SkipSection が実行されると、SkipSection: というラベルが付いた行までジャンプし、間の PRINT文は実行されません。

繰り返しになりますが、GOTO の使いすぎには注意しましょう。 通常のループ処理には FOR...NEXTWHILE...WEND を、条件分岐には IF...THEN...ELSE を使うのが基本です。

GOSUB / RETURN文:サブルーチンへのジャンプと戻り

GOSUB 文は、プログラムの一部を「サブルーチン」として定義し、それを呼び出すために使います。サブルーチンは、特定の処理をまとめたもので、プログラムのいろいろな場所から呼び出すことができます。サブルーチンの処理が終わったら、RETURN 文を使って、GOSUB で呼び出した場所の次の行に戻ります。

構文:

' サブルーチンの呼び出し
GOSUB ラベル名
' または
GOSUB 行番号
' ... 他の処理 ...
' サブルーチンの定義
ラベル名: ' サブルーチンの処理 RETURN ' 呼び出し元に戻る
' または
行番号 ' サブルーチンの処理 RETURN ' 呼び出し元に戻る

例:

PRINT "メインプログラム開始"
GOSUB PrintMessage ' サブルーチンを呼び出す
PRINT "メインプログラムに戻りました"
GOSUB PrintMessage ' もう一度呼び出す
PRINT "処理終了"
END ' プログラムをここで終了させないと、サブルーチンに流れ込んでしまう
PrintMessage: ' サブルーチンの開始ラベル PRINT "--- これはサブルーチンからのメッセージです ---" RETURN ' 呼び出し元に戻る

この例では、メインプログラムから GOSUB PrintMessagePrintMessage: ラベルのついたサブルーチンを2回呼び出しています。サブルーチン内の PRINT 文が実行された後、RETURN 文によって GOSUB の次の行(PRINT "メインプログラムに戻りました"PRINT "処理終了")に処理が戻ります。

サブルーチンの終わりには、END 文などを置いて、メインプログラムの実行がそのままサブルーチンに流れ込まないように注意が必要です。

GOSUB は、処理を部品化する簡単な方法ですが、引数を渡したり、戻り値を受け取ったりする機能はありません。より高度なサブルーチン(SUBFUNCTION)は、後のステップで学びます。これらは GOSUB よりも構造的で、より複雑なプログラムを作るのに適しています。

まとめ

命令機能戻り注意点
GOTO ラベル/行番号指定したラベル/行番号へ一方的にジャンプする戻らない (ジャンプ先に制御が移る)コードが読みにくくなるため、多用は避ける
GOSUB ラベル/行番号指定したラベル/行番号のサブルーチンを呼び出すRETURN 文で呼び出し元の次に戻る 簡単な処理の部品化に使えるが、引数/戻り値はない。構造化には SUB/FUNCTION が望ましい。
RETURNGOSUB で呼び出されたサブルーチンから、呼び出し元の次の命令に戻る(GOSUB とセットで使う)GOSUB を使わない場所で実行するとエラーになることがある。

GOTOGOSUB は、BASIC の基本的な制御構文ですが、使い方には注意が必要です。特に GOTO は、現代的なプログラミングスタイルではあまり使われません。これらの命令の特性を理解し、より読みやすく、メンテナンスしやすいコードを書くためには、IF, FOR, WHILE などの構造化構文を積極的に活用しましょう!

次のステップでは、画面への出力やキーボードからの入力について学びます。お楽しみに!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です