私はxkcdをめちゃくちゃにしていて、これを見ました(数年前にそれらについての否定的なテキストも読んだ場合):
実際には何が問題になっていますか?では、なぜC ++でもgotoが可能なのですか?
なぜ私はそれらを使用すべきではないのですか?
私はxkcdをめちゃくちゃにしていて、これを見ました(数年前にそれらについての否定的なテキストも読んだ場合):
実際には何が問題になっていますか?では、なぜC ++でもgotoが可能なのですか?
なぜ私はそれらを使用すべきではないのですか?
正しく使えば何の問題もありません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
サブルーチンを実装するために使用することは、悪用される主な方法です。これにより、不必要に読み取りや保守が困難な、いわゆる「スパゲッティ コード」が作成されます。
goto自体には何の問題もありません。これはプログラミングで非常に便利な構成であり、多くの有効な用途があります。頭に浮かぶのは、Cプログラムでの構造化されたリソースの解放です。
gotoがうまくいかないのは、虐待されたときです。gotosを悪用すると、コードが完全に読み取れなくなり、保守できなくなる可能性があります。
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 は常に有害であると見なされるべきですか?」という質問に対するジョークです。
問題をグーグルで検索しましたか?
反後藤運動の創設者は、彼の伝説的な「後藤は有害であると考えられている」を持ったEdsgerDijskstraです。
始めるには、次のURLにアクセスしてください(ハハ!)http://en.wikipedia.org/wiki/GOTO
それはCで可能であるため、C ++でも可能です。使用すべきかどうかは、長年の宗教戦争です。
C ++の設計目標は、実際のCプログラムの99ポイント程度が、C++と同じ機能でコンパイルおよび実行されることでした。含めるgoto
ことは、その目標を達成するための努力の一部でした。