195

重複の可能性:
gotoを使用するのはなぜ悪いのですか?
GOTOはまだ有害だと考えていますか?

私はxkcdをめちゃくちゃにしていて、これを見ました(数年前にそれらについての否定的なテキストも読んだ場合):
あなたの遅い接続はひどいです、この画像を見るために速いものを手に入れてください
実際には何が問題になっていますか?では、なぜC ++でもgotoが可能なのですか?

なぜ私はそれらを使用すべきではないのですか?

4

6 に答える 6

147

スパゲッティコードにつながるからです。

以前は、プログラミング言語にはwhileループ、ifステートメントなどがなく、プログラマーはgotoを使用してプログラムのロジックを構成していました。それは維持不可能な混乱につながります。

そのため、CSの神々はメソッド、条件、ループを作成しました。構造化プログラミングは当時革命でした。

gotoは、ネストされたループからジャンプする場合など、いくつかの場所で適切です。

于 2010-08-19T00:10:14.410 に答える
94

正しく使えば何の問題もありませんgoto。それが「タブー」である理由は、C の初期の頃、プログラマー (多くの場合、アセンブリのバックグラウンドから来ている) がgoto信じられないほど理解しにくいコードを作成するために使用したためです。

ほとんどの場合、なくgotoても大丈夫です。gotoただし、役立つ場合がいくつかあります。主な例は、次のような場合です。

for (i = 0; i < 1000; i++) {
    for (j = 0; j < 1000; j++) {
        for (k = 0; k < 1000; k++) {
            ...
            if (condition)
                goto break_out;
            ....
        }
    }
}
break_out:

goto深くネストされたループから飛び出すために a を使用すると、多くの場合、条件変数を使用してすべてのレベルでチェックするよりもクリーンになります。

gotoサブルーチンを実装するために使用することは、悪用される主な方法です。これにより、不必要に読み取りや保守が困難な、いわゆる「スパゲッティ コード」が作成されます。

于 2010-08-19T00:14:06.290 に答える
43

goto自体には何の問題もありません。これはプログラミングで非常に便利な構成であり、多くの有効な用途があります。頭に浮かぶのは、Cプログラムでの構造化されたリソースの解放です。

gotoがうまくいかないのは、虐待されたときです。gotosを悪用すると、コードが完全に読み取れなくなり、保守できなくなる可能性があります。

于 2010-08-19T00:08:55.413 に答える
31

1968 年、Edsger Dijkstraは、 Communications of the ACM の編集者に宛てた有名な手紙を書きました。これらの制御構造の代わりに GOTO を使用すると、非常に多くの場合、結果はスパゲッティ コードになります。現在使用されているほとんどすべてのプログラミング言語は構造化プログラミング言語であり、GOTO の使用はほとんどなくなりました。実際、Java、Scala、Ruby、Python にはコマンドがまったくありません。goto

C、C++、および Perl には依然として GOTO コマンドがあり、(特に C では) GOTO が役立つ状況があります。関数を終了する方法が複数ある場合でも (関数の進行中の複数のポイントでエラー コードを返すなど)。ただし、一般的に、その使用は、制御され認識された方法でそれを必要とする特定の設計パターンに制限する必要があります。

(C++ では、クリーンアップに GOTO を使用する代わりに、RAII またはScopeGuard (詳細)を使用することをお勧めします。しかし、GOTO は Linux カーネル(別のソース) で頻繁に使用されるイディオムであり、慣用的な C コードの優れた例です。)

XKCD コミックは、「GOTO を使用すると非常に役立つ特定の設計パターンがある場合、GOTO は常に有害であると見なされるべきですか?」という質問に対するジョークです。

于 2010-08-19T00:13:56.037 に答える
10

問題をグーグルで検索しましたか?

反後藤運動の創設者は、彼の伝説的な「後藤は有害であると考えられている」を持ったEdsgerDijskstraです。

始めるには、次のURLにアクセスしてください(ハハ!)http://en.wikipedia.org/wiki/GOTO

于 2010-08-19T00:09:33.773 に答える
9

それはCで可能であるため、C ++でも可能です。使用すべきかどうかは、長年の宗教戦争です。

C ++の設計目標は、実際のCプログラムの99ポイント程度が、C++と同じ機能でコンパイルおよび実行されることでした。含めるgotoことは、その目標を達成するための努力の一部でした。

于 2010-08-19T00:08:55.837 に答える