VicRock09
@VicRock09 (Vicky rock)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

CのGOTO文は間違っていますか?どうして?

最近、C コードのエラーについて質問したところ、goto ステートメントは場合によっては危険である可能性があるとのことでした。 goto ステートメント を使用するのが悪い考えかどうか、もしそうならその理由を知りたいです。

goto の方が簡単で、これまで失敗したことがないので、残りのループよりも goto を好むことがよくあります。私は長い間、プログラムで goto ステートメントを使用して、プログラムを何度も開かなくてもデバッグできるように、特定の場所から繰り返し実行できるようにしています。

では、goto ステートメントを利用するのはひどい考えでしょうか?もしそうなら、その理由を説明してください。それは何ができるのですか?

0

3Answer

セキュリティインシデントになったappleのgoto
https://ja.m.wikipedia.org/wiki/%E5%88%B0%E9%81%94%E4%B8%8D%E8%83%BD%E3%82%B3%E3%83%BC%E3%83%89#CVE-2014-1266

プログラムを見るとエラー処理に使ってる
https://opensource.apple.com/source/Security/Security-55471/libsecurity_ssl/lib/sslKeyExchange.c

VBAでも同じようにエラー処理にgotoを使う
http://officetanaka.net/excel/vba/statement/OnError.htm

例外を投げられない無い言語でのエラー処理にはgotoは現役な感じ
それ以外の用途で多用する人はフライングスパゲティモンスター教徒だと思うので
近寄らないで欲しいと願っています

2Like

Any function including main() SHOULD NOT be long,complex nor multi-functional which you have to skip codes with goto in order to debug. You should split your codes to functions so that you can write unit tests for them.

Goto itself DOES NOT preserve any variable declaration, nor conditional loops. Actually C++ prohibits skipping variable declarations.

1Like

Comments

  1. 雑訳ですが,要するに各部のデバッグのためにgotoするくらいなら逐一関数化してください.
    gotoでブロックを超えることは変数管理や条件分岐が曖昧になるので禁止されることが多いですが,goto禁止の根底には十分に構造化されたプログラムを書くことを意識させるという目的があります.

gotoが必要になっているというのは、1関数内で色々な処理をさせようとしすぎて、無駄に関数が長くなっていないですか?

gotoがある言語のレガシープログラムの保守を対応した事は何度かありますが、経験的に、gotoが使用されている関数は、いずれも1関数が異常に行数が多い・ネストが深いなど解読が困難で、処理の内容的に、おおよそ早期returnや関数分割等でシンプル書けそうなものが殆どでした。@bunaImage さんが挙げているように、例外が無い言語でのエラー処理目的なら何とか許容出来るかな、という感じです。

同じ関数内であちこちへ処理が飛ぶというのは、他人が読む場合のコストが半端なく高いです。関数・変数の命名で処理の内容が把握でき、上から下へ自然に読み進められるのが理想的です。1関数のサイズも、なるべくコンパクトにまとめましょう。

自分でしか使わないプログラムなら、ご自由にどうぞ。他人が保守する可能性が僅かでもあるなら、読みやすさを意識して欲しいと思います。ただ、普段から読みやすさを意識してコードを書いていない人が、急に読みやすく書くのは難しいと思うので、やはり普段から意識した方がいいと思います。

1Like

Your answer might help someone💌