2

この質問は、 Goto StillThoughdHarmfulの複製です。これについてさらに話し合いたい場合は、元の質問を使用してください。

なぜGOTOはプログラミングの実践が貧弱なのですか?場合によってはそれを使用するのが理にかなっています。

4

8 に答える 8

4

Djkstraは、「GOTOは致命的と見なされる」ではなく、「GOTOは有害であると見なされる」と書いていることに注意してください。それはその場所を持っています。残念ながら、いつ使用するかを判断するのは、他の人のコード、特に何年も前に会社で働いていない人が書いたコードを保守した経験があった後で判断します。したがって、その経験を積むまでは、できるだけ後藤を避けるのが最善です。

于 2009-01-14T16:32:30.737 に答える
3

基本的に、それは悪いコーディングスタイルを助長します。参照:後藤は有害と考えられる[pdf]

于 2009-01-14T16:30:27.450 に答える
2

それは急速にスパゲッティコードにつながる可能性があります。

于 2009-01-14T16:31:15.247 に答える
1

これは、コードを手続き的に設計していないことを意味します。

whileとifを適切に構築すれば、gotoが必要になることはめったにありません。

キーワードはめったにありません。役に立つ場合があります。その意味で、今日の多くの人々は、恐ろしい後藤を避けるために、例外を明示的にスローしてキャッチします。

于 2009-01-14T16:30:39.337 に答える
1

コードの構造を理解するのが難しい場合があるためです。

これ

y:
// do more stuff
goto x

p:
// do stuff
// then done
goto y;

x: 
  // do a bunch of stuff
  if (...)
      goto y;
  else
      goto p;

done:

よりもはるかに明確ではありません

int main()
{
    x();
}


function p()
{
    if (...)
    {
         return;
    }
}


function x()
{
    if (...)
    {
         return;
    }
    else 
    {
         p();
    }
}
于 2009-01-14T16:33:51.733 に答える
0

GOTOは制御フローを短絡させ、それによって設計を損ない、デバッグとメンテナンスの悪夢への扉を開きます。

于 2009-01-14T16:32:15.887 に答える
0

読みやすさが問題になり、gotoを使用すると、ロジックの流れが意図しない影響を与える可能性があります。

.netコンパイラがgotoを使用するようにいくつかのcase/switchステートメントを変更するのはおかしいと思います。

于 2009-01-14T16:33:25.477 に答える
0

場合によっては、それは理にかなっています。ただし、ほとんどの場合、forループやwhileループなどの構造化コードを使用する場合に比べて、コードの実行パスを読みにくくする可能性があるため、これを使用すると不適切な方法と見なされます。

gotoまたはラベルを見ると、コードを読んだり、ラベル名を検索したりしなければ、どこに行くのか、どこから来るのかがわかりません。これは、gotoがラベルと同じ画面に収まらない場合は特に注意が必要です。これをforループまたはwhileループまたはifと比較してください。構造(つまりコードのインデント)から実行パスが何であるかを知ることができます。

そうは言っても、特に、多次元配列内の特定の値を掘り下げているネストされたforループからジャンプする場合などに役立つことがあります。ここでgotoを使用すると、正しい値が見つかったときにforループからジャンプできます。

于 2009-01-14T16:33:27.677 に答える