この記事には複数の問題があります。改善
やノートページでの議論にご協力ください。プログラミング言語におけるgoto文(ゴートゥぶん、英: goto statement)とは、手続き列中の指定された場所(専らラベルで指定される)に無条件にジャンプ(移動)する、という制御構造のひとつを表現するための「文」である。古い文献などで "go to" と離していることもあるのは、英語の go to どこそこ、といったような言い回しとの類似のためでもあり、FORTRANではプログラム中の空白は基本的に無視されるので、goto でも go to でも同じだったからという理由もある(BASIC処理系の中にも、どちらも使えるようにしているものもある[要説明])。 goto文は、それ単体では働きを持たせることはできず、必ずラベルか何かによってジャンプ先が必要である。機械語における分岐命令の一種である無条件分岐と、アセンブリ言語のラベルをそのまま手続き型プログラミングに持ち込んだものと言え、何らかの条件分岐との組み合わせによって、ループであるとか、コードブロックの飛び越しであるとかいったような機能の一部となることができる。 「以前に実行した場所に戻る」というループ用途なのか、それともこの先にあるコードは別の流れの一部なので「単に飛び越したいだけ」というジャンプ用途なのか、という単純なことすら、goto文ではその見かけからは分からない。if文やwhile文と比較して、goto文はコードの意図が不明瞭になるため、後述のように、if文やwhile文で単純に書けることであれば、gotoは使うべきではない。一方で、深く多重にネストしたループからの脱出などgotoを使ったほうが単純かつ明確に書ける場合もあり[注釈 1]、特にC言語においてはgotoを教条的・無条件に排除するべきではない。 資源の確保と解放などのために、プログラム片の入口と出口が必ず対応している必要がある、といった場合などは、gotoに限らず、いわゆる「途中return」等の他の多くの技法も制限されるので、以下のgoto文の議論とはきちんと区別すべきであるし、またそういった場合の制限を全てのコーディングに適用するべきではない。 なお、冗談半分[1]ではあるが、ジャンプ先のほうにcome fromという文を置き、ジャンプ元にラベルを置く、という「comefrom文」の提案もある。提案自体はジョークだが、同等の機能がある言語は実際にいくつかあり、プログラムの理論上の研究対象にもなっている。 次のように、ラベルの付いた文と併用する[注釈 2]。clear: x = 0;……goto clear; goto文によって、そこからclearラベルの付いた文にジャンプし、そこから処理を続ける。 Cなどの構造化プログラミング言語においては、goto文はむやみに使ってはいけないというルールが、プロジェクト等のガイドライン等として定められていることがある。これは、goto文が原始的で自由度の高すぎる機能であるため、安易なgoto文の使用はプログラムの構造化を妨げ、デバッグなどが行いにくくなり、バグの発生や、メンテナンス性・可読性の低下の原因になりやすいからである。 しかし、多重にネストしたfor文やif文、while文などでエラー処理や例外処理などが複雑になる場合はgoto文を使った方がプログラムがすっきりと書けるケースもあるため、プログラムの構造を熟知したプログラマが状況に応じて使い分けるものとされている。
概要
構文
批判「構造化プログラミング」を参照