私はxkcdを使い回していましたが、これを見ました(数年前にそれらについてのネガティブな文章も読んだ場合):
実際に何が問題なのですか?なぜgotoはC++でも可能ですか?
なぜnot使用しないのですか?
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
を使用してサブルーチンを実装することが、悪用される主な方法です。これにより、いわゆる「スパゲッティコード」が作成されますが、これは不必要に読み取りや保守が困難です。
Goto自体に問題はありません。これはプログラミングにおいて非常に有用な構成要素であり、多くの有効な用途があります。思い浮かぶのは、Cプログラムで構造化されたリソースを解放することです。
Gotoがうまくいかないのは、虐待されたときです。 gotosの乱用は、コードを完全に判読不能かつ保守不能にする可能性があります。
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は常に有害と見なされるべきか?」という質問に対する冗談です。
問題をグーグルで調べましたか?
反後藤運動の創設者は、彼の伝説的な「後藤は有害だ」とエドスガー・ダイスクストラです
開始するには、(ハハ!)に移動します http://en.wikipedia.org/wiki/GOTO
C++で可能なのは、Cで可能だからです。使用すべきかどうかは、長年の宗教戦争です。