C言語コードにgotoは使えませんか?
2431 ワード
私がC言語を勉強しているとき、先生は一日中私に「gotoを使わないでください.これは悪い習慣です.この書き方は腐っていて、危険です」と教えてくれました.などなど.
しかし、なぜそんなに多くのカーネルプログラマーがgotoを使うのが好きなのでしょうか.
このlinuxカーネルでhttps://github.com/torvalds/linux/blob/master/kernel/sched/clock.cコードでは、簡単なwhileで置き換えることができると思います.
注意:このコードはtorvaldsのlinuxカーネルコードから来て、実はwhileだけではなくて、if(){}else{}の構造を使うことができて、多くのカーネルの他のファイルもこのようにして、fs.open http://lxr.linux.no/linux+v3.12.6/fs/open.c#L 464は理解できませんが、場合によってはgotoをwhile/do-whileより使ったほうがいいですか?もしそうなら、どうしてですか.
注:もう少しでもっと良いWorse Is Betterの観点を別の角度から解釈したのかもしれません.
by: musicmatze
海外のネットユーザーからの素晴らしいコメント:
回答1:
この例では,従来のSMP不安全(non−SMP−safe)方式からSMP方式に変更したと推定する.goto文を用いて元のコードに対する変更量を最小限に抑え,潜在的なリスクを引き起こす確率を最小限に抑える.
私も実はあなたたちがこのような方法を使うことに賛成しませんが、gotoを絶対に使わないのも誤解だと思います.前に進むだけで、決して後退しない関数の中で、gotoを使って絶対に死の循環を引き起こさないで、しかもこの方式は絶対に最も簡単で最もはっきりしたジャンプ方式です.(コードをクリーンアップし、エラーを返すときに使用するなど)
by: R..
回答2:
歴史:Dijkstraが1968年に書いたGoto Considered Haを覚えているかもしれません.rmfulhttp://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html、もうすぐ半世紀が経ちます.外ではもうgotoはめったに見られません.
しかし、この例を分析してみましょう.エラー処理について、構造化された文法で書きましょう.
では、gotoに変えますか?
このコードはすべて平級で、互いに辛くなく、明らかにgotoの構造がもっと良いことを見ました.
by: Dietrich Epp
国内のネットユーザーからの素晴らしいコメント
夜の風雪2014-01-09 21:04
一言で「アセンブリを書くのに慣れた」と説明する.アプリケーションを書く人にとって、if、whileはもちろん熟知しているので、これ以上熟知することはできませんが、システムプログラマーは違って、ハードウェアと付き合うことが多いので、よくアセンブリを書きます.特に、初期のlinuxカーネルコードには大量のアセンブリがあるなど、アセンブリに慣れている可能性があります.アセンブリにはif,whileというものはなく,基本的には無条件と条件ジャンプである.だから使い慣れて、慣れよう.
劉江総編2014-01-09 16:05実はgoto文の問題で、『コード大全』(Code Complete)には17.3専門の一節が支持(Knuth大神をはじめ)と反対(Dijkstra大神をはじめ)の両方の観点を詳しく述べている.最後に著者本人の結論は:90%の場合gotoを使うのはすべて間違っているが、少数の場合gotoは確かに有効である(例えば、エラー処理中の多重判断、また2つの条件判断と1つのelse句の場合)、問題を解決する合理的な方法である.このときgotoを使ってもいいですが、注釈をつけて理由を説明しなければなりません.
このセクションの英語のネット上には、次のものがあります.http://www.stevemcconnell.com/ccgoto.htm
しかし、なぜそんなに多くのカーネルプログラマーがgotoを使うのが好きなのでしょうか.
このlinuxカーネルでhttps://github.com/torvalds/linux/blob/master/kernel/sched/clock.cコードでは、簡単なwhileで置き換えることができると思います.
while(condition)
{
}
//
do
{
}while(condition);
注意:このコードはtorvaldsのlinuxカーネルコードから来て、実はwhileだけではなくて、if(){}else{}の構造を使うことができて、多くのカーネルの他のファイルもこのようにして、fs.open http://lxr.linux.no/linux+v3.12.6/fs/open.c#L 464は理解できませんが、場合によってはgotoをwhile/do-whileより使ったほうがいいですか?もしそうなら、どうしてですか.
注:もう少しでもっと良いWorse Is Betterの観点を別の角度から解釈したのかもしれません.
by: musicmatze
海外のネットユーザーからの素晴らしいコメント:
回答1:
この例では,従来のSMP不安全(non−SMP−safe)方式からSMP方式に変更したと推定する.goto文を用いて元のコードに対する変更量を最小限に抑え,潜在的なリスクを引き起こす確率を最小限に抑える.
私も実はあなたたちがこのような方法を使うことに賛成しませんが、gotoを絶対に使わないのも誤解だと思います.前に進むだけで、決して後退しない関数の中で、gotoを使って絶対に死の循環を引き起こさないで、しかもこの方式は絶対に最も簡単で最もはっきりしたジャンプ方式です.(コードをクリーンアップし、エラーを返すときに使用するなど)
by: R..
回答2:
歴史:Dijkstraが1968年に書いたGoto Considered Haを覚えているかもしれません.rmfulhttp://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html、もうすぐ半世紀が経ちます.外ではもうgotoはめったに見られません.
しかし、この例を分析してみましょう.エラー処理について、構造化された文法で書きましょう.
if (do_something() != ERR) {
if (do_something2() != ERR) {
if (do_something3() != ERR) {
if (do_something4() != ERR) {
...
では、gotoに変えますか?
if (do_something() == ERR) //
goto error; //
if (do_something2() == ERR) //
goto error; //
if (do_something3() == ERR) //
goto error; //
if (do_something4() == ERR) //
goto error;
このコードはすべて平級で、互いに辛くなく、明らかにgotoの構造がもっと良いことを見ました.
by: Dietrich Epp
国内のネットユーザーからの素晴らしいコメント
夜の風雪2014-01-09 21:04
一言で「アセンブリを書くのに慣れた」と説明する.アプリケーションを書く人にとって、if、whileはもちろん熟知しているので、これ以上熟知することはできませんが、システムプログラマーは違って、ハードウェアと付き合うことが多いので、よくアセンブリを書きます.特に、初期のlinuxカーネルコードには大量のアセンブリがあるなど、アセンブリに慣れている可能性があります.アセンブリにはif,whileというものはなく,基本的には無条件と条件ジャンプである.だから使い慣れて、慣れよう.
劉江総編2014-01-09 16:05実はgoto文の問題で、『コード大全』(Code Complete)には17.3専門の一節が支持(Knuth大神をはじめ)と反対(Dijkstra大神をはじめ)の両方の観点を詳しく述べている.最後に著者本人の結論は:90%の場合gotoを使うのはすべて間違っているが、少数の場合gotoは確かに有効である(例えば、エラー処理中の多重判断、また2つの条件判断と1つのelse句の場合)、問題を解決する合理的な方法である.このときgotoを使ってもいいですが、注釈をつけて理由を説明しなければなりません.
このセクションの英語のネット上には、次のものがあります.http://www.stevemcconnell.com/ccgoto.htm