1. ホーム
  2. c++

[解決済み] CまたはC++の良いゴトの例 [終了しました]。

2022-03-03 03:41:38

質問

このスレッドでは、以下のような良い使用例を見ていきます。 goto をCまたはC++で作成します。 これは 回答 というのも、私が冗談で言っているのだと思い、投票した人がいたからです。

概要(意図をさらに明確にするため、ラベルを原文から変更しました)。

infinite_loop:

    // code goes here

goto infinite_loop;

なぜ代替品より優れているのか

  • 具体的である。 goto は を発生させる言語構成です。 無条件に分岐します。 代替案 構造体を使用する必要があります。 条件分岐をサポートする という、常に真であることを縮退した という条件があります。
  • ラベルは意図を文書化する 余分なコメントなし
  • をスキャンする必要がありません。 を探すために、間に挟まれたコード break s (ただし 無節操なハッカーは continue を、初期の goto ).

ルールです。

  • ゴト師はいなかったことにする。 を勝ち取る。 上記のように理解されています。 実際のコードでは使用できません。 は、確立されたイディオムに反しています。
  • という言葉を聞いたことがあると仮定します。 有害とみなされる後藤」であり を使用することができます。 スパゲッティ・コード
  • 例題に異論がある場合。 技術的なメリットで批判する を嫌う人が多いからです。 goto」は技術的な理由にはなりません)。

大人らしく話し合おうじゃないか。

編集

この質問はもう終了したようです。 質の高い回答がいくつも生まれました。 皆さん、ありがとうございました。 特に、私の小さなループの例を真剣に受け止めてくれた人たち。 ほとんどの懐疑的な人は ブロックスコープがないことで コメントで@quinmarsさんが指摘されたように、中括弧で囲めばいつでも ループ本体 ついでに書いておくと for(;;)while(true) は中括弧をくれません。 を省略すると、厄介なバグが発生することがあります)。 とにかく、私はこれ以上 この些細なことにあなたの脳力を使ってください - 私は無害で慣用的な for(;;)while(true) (仕事を続けたいなら、ちょうどいい)。

他の回答も考えると、多くの人が goto 常に は別の方法で書き直さなければなりません。 もちろん goto ループを導入することで フラグ、ネストされた if などがありますが、この機会に goto は この仕事に最適なツールなのでしょうか?別の言い方をすれば、組み込みの言語機能を本来の目的で使わないために、人々はどれだけの醜態をさらす覚悟があるのでしょうか。私が思うに フラグを付けるだけでも高すぎる。 私は、変数には、以下のようなものを表現してほしいと思っています。 問題領域と解決領域 「ただ単に goto ではダメなんです。

クリーンアップブロックへの分岐のCパターンを挙げた最初の答えを受け入れることにします。IMOは、これが goto 投稿されたすべての回答のうち、確かに 嫌われ者がそれを避けるためにしなければならない苦悩で測った場合。

解決方法は?

私が聞いたことのあるトリックをひとつ紹介します。でも、実際に見たことはありません。C++にはRAIIがあり、よりイディオムにこれを行うことができるからです。

void foo()
{
    if (!doA())
        goto exit;
    if (!doB())
        goto cleanupA;
    if (!doC())
        goto cleanupB;

    /* everything has succeeded */
    return;

cleanupB:
    undoB();
cleanupA:
    undoA();
exit:
    return;
}