問題タブ [goto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PHPのGOTOコマンド?
PHPが「goto」コマンドの導入を計画しているという噂を聞いたことがあります。何をしているの?
少し検索してみましたが、ひどく説明的なものは見つかりませんでした。GOTO 10
「 」のようなコマンドではないことを理解しています。
language-agnostic - ループと関数をサポートする言語での「goto」の正当なユースケースはありますか?
私は長い間goto
、可能であれば決して使用されるべきではないという印象を受けてきました。
しかし、先日、libavcodec(Cで書かれている)を熟読していると、何度も使用されていることに驚きました。
goto
ループと関数をサポートする言語で使用することは、これまでに有利ですか?もしそうなら、なぜですか?の使用を明確に正当化する具体的な例を提供してくださいgoto
。
language-agnostic - GOTO はまだ有害と見なされていますか?
Dijkstra の編集者への手紙: go to ステートメントが有害であると見なされていることは誰もが認識しており(こちらの.html トランスクリプトとこちらの .pdf も)、その時以来、可能な限り goto ステートメントを避けるようにという手ごわいプッシュがありました。goto を使用して保守不可能な無秩序なコードを生成することは可能ですが、それでも最新のプログラミング言語に残っています。Schemeの高度な継続制御構造でさえ、洗練された goto として記述できます。
goto の使用が正当化されるのはどのような状況ですか? 避けるのがベストな時期は?
フォローアップの質問として: C は setjmp() と longjmp() の 1 組の関数を提供します。これらは、現在のスタック フレーム内だけでなく、任意の呼び出しフレーム内で goto する機能を提供します。これらは goto と同じくらい危険であると考えるべきですか? もっと危ない?
ダイクストラ自身は、彼が責任を負わなかったそのタイトルを後悔しました。EWD1308 (これも.pdf )の最後に、彼は次のように書いています。
最後に記録のための短い物語。1968 年、Communications of the ACM は、「 goto ステートメントは有害であると見なされた」というタイトルで私のテキストを公開しました。このタイトルは、テンプレートになることで私の名声の基礎となりました。「ダイクストラは有害と見なされます」というタイトルの記事を含め、ほぼすべての X について、「X は有害と見なされます」というタイトルの下にあらゆる種類の記事が表示されます。しかし、何が起こったのですか?私は「 goto文に対する訴訟」というタイトルで論文を提出していました」の発行を早めるために、編集者は「編集者への手紙」に変更し、その過程で彼は自分の発明の新しいタイトルを付けました! 編集者はニクラウス・ヴィルトでした.
このトピックに関するよく考えられた古典的な論文は、Dijkstra の論文と一致するように、Donald E. Knuth による構造化プログラミング with go to Statementsです。両方を読むことは、主題の文脈と非独断的な理解を再確立するのに役立ちます. この論文では、このケースに関するダイクストラの意見が報告されており、さらに強力です。
ドナルド E. クヌース:私は、そのような見解を提示することによって、実際にダイクストラの考えに激しく反対しているわけではないと信じています。彼は最近次のように書いているからです:まるでプログラミングの概念的な問題が 1 つのトリック、単純な形式のコーディング規律によって解決できるかのように、他の人がそれから宗教を作っているという不快な感じがあります!」
language-agnostic - 有害と見なされますか?
開発者は、ループの次の繰り返しを強制するために、C# または他の言語での同等の使用を避けるべきですか? 賛成または反対の議論はGotoに関する議論と重複しますか?
c++ - C または C++ での適切な goto の例
このスレッドではgoto
、C または C++ での の適切な使用例を見ていきます。これは、私が冗談だと思ったために人々が投票した回答に触発されたものです。
要約(意図をより明確にするためにラベルをオリジナルから変更):
代替案より優れている理由:
- それは具体的です。
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
、投稿されたすべての回答の中で最も強力なケースです。確かに、嫌いな人がそれを回避するために経験しなければならないゆがみによってそれを測定する場合.
c++ - goto とデストラクタは互換性がありますか?
このコードは、未定義の動作につながります。
コンストラクターは呼び出されません。
しかし、このコードはどうですか?x のデストラクタは呼び出されますか? そうなると思いますが、確認したいです。:)
c++ - GOTOするか、GOTOしないか?
現在、gotoステートメントが多用されるプロジェクトに取り組んでいます。gotoステートメントの主な目的は、複数のreturnステートメントではなく、ルーチン内に1つのクリーンアップセクションを含めることです。以下のように:
これにより、コードの1つのセクション、つまりExitラベルの後のクリーンアップコードを追跡できるため、はるかに簡単になります。
しかし、私は多くの場所を読んだことがありますが、gotoステートメントを使用するのは悪い習慣です。
現在、Code Completeの本を読んでいますが、宣言に近い変数を使用する必要があると書かれています。gotoを使用する場合は、gotoを最初に使用する前にすべての変数を宣言/初期化する必要があります。そうしないと、コンパイラーはxx変数の初期化がgotoステートメントによってスキップされるというエラーを出します。
どちらが正しいですか?
スコットのコメントから:
あるセクションから別のセクションにジャンプするためにgotoを使用すると、コードが読みにくくなり、理解しにくくなるため、悪いように見えます。
しかし、gotoを使用して1つのラベルに進む場合は、問題ありません(?)。
python - Pythonにラベル/gotoはありますか?
goto
特定のコード行にジャンプできるようにするために、Pythonに同等のものはありますか?
goto - なぜ後藤は練習が悪いのですか?
この質問は、 Goto StillThoughdHarmfulの複製です。これについてさらに話し合いたい場合は、元の質問を使用してください。
なぜGOTOはプログラミングの実践が貧弱なのですか?場合によってはそれを使用するのが理にかなっています。
vb.net - VB.Net で GoTo ステートメントを使用できるのはいつですか?
データベースに一連のレコードを作成し、問題が発生した場合はすべてをロールバックする必要があるプロセスがあります。私がやりたいことはこれです:
これは GoTo ステートメントの適切な使用法ですか、それとも本当に悪い設計ですか? よりエレガントなソリューションはありますか?うまくいけば、このサンプルは要点を伝えることができます