タグ付けされた質問 「goto」

命令型プログラミングでは、「go to」ステートメントは、制御フローを「goto」ステートメントによって参照されるプログラムのポイントに変更する無条件のジャンプ命令です。

30
後藤はまだ有害だと考えていますか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 5年前休業。 この質問を改善する 誰もがダイクストラの編集者への手紙を知っています。有害と見なされるステートメントに移動し(ここでも .htmlトランスクリプトとここに .pdf)、その時点からgotoステートメントを可能な限り避けようとする手ごわいプッシュがありました。gotoを使用して、保守不可能な大規模なコードを生成することは可能ですが、それでも最新のプログラミング言語には残っています。Schemeの高度な継続制御構造でさえ、洗練されたgotoとして説明できます。 gotoを使用する必要があるのはどのような場合ですか?いつ避けるのが最善ですか? 追加質問として:Cは、現在のスタックフレーム内だけでなく、任意の呼び出しフレーム内に移動する機能を提供する、setjmpとlongjmpの2つの関数を提供します。これらはgotoと同じくらい危険だと考えるべきですか?もっと危険な? ダイクストラ自身はその肩書きを後悔したが、彼には責任がなかった。EWD1308(ここでも .pdf)の終わりに彼は書きました: 最後に、記録のための短編小説。1968年、ACMの通信は「有害と見なされたgotoステートメント」というタイトルで私のテキストを公開しましたが、これは後年最も頻繁に参照されることになりますが、残念ながら、それよりも多くの場合、テンプレートになることで私の名声の土台となったタイトル:「Dijkstra有害と見なされる」というタイトルのタイトルを含むほとんどすべてのXについて、「X有害と見なされる」というタイトルの下にあらゆる種類の記事が表示されます。しかし、何が起こったのでしょうか?「後藤声明に反対する訴訟」というタイトルで論文を提出しました「それは、その出版をスピードアップするために、編集者は「編集者への手紙」に変わりました、そしてその過程で彼は彼自身の発明の新しいタイトルを与えました!編集者はニクラウス・ワースでした。 このトピックについてよく考え抜かれた古典的な論文は、ダイクストラの論文と一致するように、Donald E. Knuthによるgo to Statementsを使用した構造化プログラミングです。両方を読むことは、文脈の再確立と主題の非独断的な理解に役立ちます。この論文では、このケースに関するダイクストラの意見が報告されており、さらに強力です。 ドナルドE.クヌース:そのような見解を示すことで、ダイクストラの考えにはっきりと反対しているのではないと私は信じています。彼が最近次のように書いたからです。ステートメントに行く]。プログラミングの概念的な問題は、単純な形式のコーディング規律によって1つのトリックで解決できるかのように、他の人がそれを信仰しているという不快な気持ちを持っています! "

22
Javaにgotoステートメントはありますか?
私はこれについて混乱しています。私たちのほとんどは、Javaにはgotoステートメントがないと言われています。 しかし、Javaのキーワードの1つであることがわかりました。どこで使用できますか?使えないのに、なぜJavaにキーワードとして含まれていたのか?
259 java  syntax  keyword  goto 


25
ループと関数をサポートする言語で「goto」を使用することの利点はありますか?もしそうなら、なぜですか?
私は長い間goto、可能であれば使用すべきではないという印象を受けてきました。先日、libavcodec(Cで書かれています)を調べていると、複数の使い方があることに気付きました。gotoループと関数をサポートする言語で使用することが有利になることはありますか?もしそうなら、なぜですか?



3
Goに「goto」ステートメントがあるのはなぜですか
Goに「goto」という文があることに驚きました。「goto」ステートメントは過去のものであり、それがプログラムの実際のフローをふさいでしまうために邪悪であり、関数またはメソッドは常にフローを制御するより良い方法であると私は常に教えられてきました。 私は何かを逃しているに違いない。なぜGoogleはそれを含めたのですか?
110 go  goto 

8
まだC#で​​[goto]を使用している人はいますか。[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 6年前休業。 この質問を改善する まだC#で​​「goto」キーワード構文を使用している人がいるかどうか、その理由は何ですか。 私は、読者にコードをジャンプさせるようなステートメントを悪い習慣と見なす傾向がありますが、そのような構文を使用するための信頼できるシナリオがあるかどうか疑問に思いましたか? キーワード定義に移動
104 c#  .net  coding-style  goto 

1
gotoリーク変数を使用しますか?
gotoデストラクタなどを呼び出さずにコードの一部をジャンプするのは本当ですか? 例えば void f() { int x = 0; goto lol; } int main() { f(); lol: return 0; } ではないだろうx漏洩しますか?
94 c++  goto 

15
Cでのエラー管理のためのgotoの有効な使用?
この質問は、実際には、少し前にprogramming.reddit.comで行われた興味深い議論の結果です。基本的には次のコードになります。 int foo(int bar) { int return_value = 0; if (!do_something( bar )) { goto error_1; } if (!init_stuff( bar )) { goto error_2; } if (!prepare_stuff( bar )) { goto error_3; } return_value = do_the_thing( bar ); error_3: cleanup_3(); error_2: cleanup_2(); error_1: cleanup_1(); return return_value; } ここでの使用法がgoto最善の方法であるように見え、すべての可能性の中で最もクリーンで最も効率的なコードが得られるか、少なくとも私には思えます。コード・コンプリートでのスティーブ・マコーネルの引用: gotoは、リソースを割り当て、それらのリソースに対して操作を実行し、リソースの割り当てを解除するルーチンで役立ちます。gotoを使用すると、コードの1つのセクションをクリーンアップできます。gotoを使用すると、エラーを検出した各場所でリソースの割り当てを忘れる可能性が低くなります。 このアプローチの別のサポートは、このセクションのLinux …


3
JVMのコンパイラは「ワイド」gotoを使用しますか?
gotoJava言語では予約済みのキーワードですが、実際には使用されていません。そして、あなたはおそらくそれgotoがJava仮想マシン(JVM)オペコードであることも知っています。私は、Java、ScalaのとKotlinのすべての高度な制御フロー構造は、JVMレベルで、いくつかの組み合わせを使用して実装されて数えるgotoとifeq、ifle、ifltなど、 JVM仕様https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto_wを見ると、goto_wオペコードもあることがわかります。一方、gotoオフセット2バイトの分岐を取り、goto_wオフセット4バイトの分岐を取ります。仕様には、 がgoto_w命令はオフセット4バイトの分岐を取り、他の要因は、65535バイト(§4.11)のメソッドのサイズを制限します。この制限は、Java仮想マシンの将来のリリースで引き上げられる可能性があります。 goto_w他のいくつかの*_wオペコードのように、将来に備えているように思えます。しかし、私goto_wはgoto、必要に応じて調整を行って、上位2バイトをゼロにし、下位2バイトをと同じように使用して、必要に応じて調整することもできます。 たとえば、次のJava Switch-Case(またはScala Match-Case)があるとします。 12: lookupswitch { 112785: 48 // case "red" 3027034: 76 // case "green" 98619139: 62 // case "blue" default: 87 } 48: aload_2 49: ldc #17 // String red 51: invokevirtual #18 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 54: ifeq 87 57: iconst_0 58: istore_3 59: …
47 java  jvm  goto 

2
変数の初期化を飛び越えるのは不適切な形式ですか、それとも未定義の動作を引き起こしますか?
このコードを考えてみましょう: void foo() { goto bar; int x = 0; bar: ; } へのジャンプが変数の初期化をバイパスするため、GCCとClang はそれを拒否しbar:ます。MSVCはまったく文句を言いません(xafter を使用bar:すると警告が表示されます)。 同じことをaで行うことができますswitch: void foo() { switch (0) { int x = 0; case 0: ; } } 3つのコンパイラすべてがエラーを出力するようになりました。 これらのスニペットの形式は不適切ですか?または、それらはUBを引き起こしますか? 以前はどちらも形式が正しくないと思っていましたが、標準の魅力的な部分を見つけることができません。[stmt.goto]は、このことについて何も言われ、どちらもしないん[stmt.select] 。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.