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

BASIC

こんにちは!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 が望ましい。
RETURN GOSUB で呼び出されたサブルーチンから、呼び出し元の次の命令に戻る (GOSUB とセットで使う) GOSUB を使わない場所で実行するとエラーになることがある。

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

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

コメント

タイトルとURLをコピーしました