web-dev-qa-db-ja.com

gotoの使用の何が問題になっていますか?

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

私はxkcdを使い回していましたが、これを見ました(数年前にそれらについてのネガティブな文章も読んだ場合):
your slow connection sucks, get a faster one to see this image
実際に何が問題なのですか?なぜgotoはC++でも可能ですか?

なぜnot使用しないのですか?

96
user142019

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

過去のプログラミング言語には、while()if()などがなく、プログラマーはgotoを使用してプログラムのロジックを作成していました。それは維持不可能な混乱につながります。

これが、CS神が関数の条件とループを作成した理由です。 構造化 プログラミングは当時革命でした。

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

95
Byron Whitlock

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を使用して深くネストされたループから飛び出すことは、多くの場合、条件変数を使用してすべてのレベルでチェックするよりも簡単です。

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

58
bta

Goto自体に問題はありません。これはプログラミングにおいて非常に有用な構成要素であり、多くの有効な用途があります。思い浮かぶのは、Cプログラムで構造化されたリソースを解放することです。

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

32
JaredPar

1968年、 Edsger Dijkstra の編集者に有名な手紙を書きましたACMのコミュニケーションGOTOは有害と考えられますwhileループおよびif ... then ... else条件付きの構造化プログラミング。これらの制御構造の代わりにGOTOを使用すると、結果は非常に頻繁に spaghetti code になります。今日使用されているほとんどすべてのプログラミング言語は構造化プログラミング言語であり、GOTOの使用はほとんど排除されています。実際、Java、Scala、Ruby、およびPythonにはgotoコマンドはまったくありません。

C、C++、およびPerlにはまだGOTOコマンドがあり、(特にCでは) GOTOが便利です の状況があります。たとえば、複数のループを終了するbreakステートメント、または集中する方法として関数を終了する方法が複数ある場合でも、関数の1か所でコードをクリーンアップします(関数の進行中の複数のポイントでエラーコードを返すなど)。ただし、一般に、その使用は、制御され認識された方法でそれを必要とする特定の設計パターンに制限する必要があります。

(C++では、クリーンアップにGOTOを使用する代わりに、RAIIまたは ScopeGuard(more) を使用することをお勧めします。しかし、GOTOは Linuxでよく使用されるイディオムですkernel別のソース )これは慣用的なCコードの素晴らしい例です。)

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

24
Ken Bloom

問題をグーグルで調べましたか?

反後藤運動の創設者は、彼の伝説的な「後藤は有害だ」とエドスガー・ダイスクストラです

開始するには、(ハハ!)に移動します http://en.wikipedia.org/wiki/GOTO

8
John Smith

C++で可能なのは、Cで可能だからです。使用すべきかどうかは、長年の宗教戦争です。

6