このスレッドではgoto
、C または C++ での の適切な使用例を見ていきます。これは、私が冗談だと思ったために人々が投票した回答に触発されたものです。
要約(意図をより明確にするためにラベルをオリジナルから変更):
infinite_loop:
// code goes here
goto infinite_loop;
代替案より優れている理由:
- それは具体的です。
goto
無条件分岐を引き起こす言語構造です。代替手段は、縮退した常に真の条件で、条件分岐をサポートする構造を使用することに依存します。 - ラベルは、追加のコメントなしで意図を文書化します。
- 読者は、介在するコードを初期の s でスキャンする必要はありません
break
(ただし、非原理的なハッカーが初期の s でシミュレートする可能性はまだありますcontinue
)goto
。
ルール:
- ゴトフォブが勝てなかったふりをする。上記は確立されたイディオムに反するため、実際のコードでは使用できないことが理解されています。
- 「Goto は有害と見なされる」という言葉を聞いたことがあると仮定し、goto を使用してスパゲッティ コードを記述できることを知っているとします。
- 例に同意できない場合は、技術的なメリットだけで批判してください (「人々が goto を好まないから」は技術的な理由ではありません)。
これについて大人のように話せるか見てみましょう。
編集
この質問は現在終了しているようです。質の高い回答が得られました。みんな、特に私の小さなループの例を真剣に受け止めてくれた人たちに感謝します。ほとんどの懐疑論者は、ブロック スコープの欠如を懸念していました。@quinmars がコメントで指摘したように、いつでもループ本体を中かっこで囲むことができます。私はそれに注意し、中かっこも無料で提供for(;;)
しwhile(true)
ません (また、中かっこを省略すると厄介なバグが発生する可能性があります)。とにかく、私はこのささいなことであなたの脳力をこれ以上浪費することはありません.私は無害で慣用的なものと一緒に暮らすことができfor(;;)
ますwhile(true)
.
他の回答を考慮すると、多くの人goto
が常に別の方法で書き直さなければならないものと見なしているようです。もちろんgoto
、ループ、余分なフラグ、ネストされた s のスタックなどを導入することで を回避できますが、がおそらくその仕事に最適なツールであるif
かどうかを検討してみませんか? goto
別の言い方をすれば、組み込みの言語機能を意図された目的のために使用することを避けるために、人々はどれだけの醜さに耐える準備ができているのでしょうか? 私の見解では、フラグを追加するだけでも、支払うには高すぎるということです。私は自分の変数が、問題または解決策のドメイン内のものを表すのが好きです。「回避するためだけにgoto
」はそれをカットしません。
クリーンアップ ブロックに分岐するための C パターンを示した最初の回答を受け入れます。IMO、これはgoto
、投稿されたすべての回答の中で最も強力なケースです。確かに、嫌いな人がそれを回避するために経験しなければならないゆがみによってそれを測定する場合.