[解決済み] CまたはC++の良いゴトの例 [終了しました]。
質問
このスレッドでは、以下のような良い使用例を見ていきます。
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;
}
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された