- ベストアンサー
go toに変わるもの
go to文の他に、指定した行まで戻ったり、進んだり出来る構文ってあるんでしょうか?go to文はあまり使うなと、本などでは言われているので。 例えば、下記のような時にgo to文以外の構文を、あれば使いたい・・・。 /*-----------main.c--------------*/ int jump(void); void main(){ int a,b,ret; scanf("%d %d",&a,&b); //(1) if(a == 1 && b == 1){ //ここの条件は今適当に付けた ret = jump(); if(ret != 1) ~~; //ここで(1)の処理に戻りたい。go to文以外で。 } } int jump(void){ int a,b; scanf("%d %d",&a,&b); return a+b; } 上記は、適当に組んだものなので細かい所は気にしないで下さい。 もし構文があるならば教えてください。よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
★回答者 No.2 です。追記。 ・goto 文に関するやり取りを見つけましたので読んでみて下さい。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=25&topic=11153→『なぜ「GOTO文」を使っては、いけないのですか?』 ↑ C言語ではなく VB だけど参考になるかな。 ・次の Web ページもどうぞ。 http://www.nurs.or.jp/~sug/soft/super/goto.htm→『Super Technique 講座~goto 文が有用な場合』 ↑ ここにある『多重脱出』は goto 文が有効であると私も思います。 ・良くループ文で break 命令は使われますが continue を使っている人(使いこなせている人が あまり見かけません。時には有効な命令ですので continue 文も break 文も上手に使えるように なりましょう。ちなみに私は while ( … ){ if ( … ){ : 少々長い : } else if ( … ){ : 少々長い : } else if ( … ){ : 少々長い : } else{ : 少々長い : } } という構文の場合は while ( … ){ if ( … ){ : 少々長い : continue; } if ( … ){ : 少々長い : continue; } if ( … ){ : 少々長い : continue; } : 少々長い : } という感じで continue 文を利用します。 あまり長い場合は関数やマクロ関数として分離することもあります。 また、条件式が定数式にできる場合には積極的に switch 文を利用します。 ・その他にも return 文がありますが、こちらも上手に利用すれば見やすいソースになります。 使いすぎると goto 文と同じくソースを醜くします。 return 文も出来る限り1箇所にまとめたいものです。 ・goto、break、continue、return を上手に利用するにはある処理を複数の処理で実際に書いてみます。 (1)for 文を使って書く (2)while 文を使って書く (3)do-while 文を使って書く (4)if-if else-else 文を使って書く (5)switch 文を使って書く このような制御文を駆使して同じ処理を書き換えて見ます。 そして一番スッキリ見やすく、分かりやすくなるソースと処理を結ぶ付けて覚えていく。 もちろん時間に余裕がある場合に複数のパターンを考えて見ます。 最後に: ・今回の場合は do-while 文ですが if の条件の真偽を反転すると次のようにも書けます。 int main( void ) { int a, b; do { scanf( "%d %d", &a, &b ); if ( !(条件式) ){ // 抜ける条件 break; } } while ( jump() != 1 ); // 戻り値で続行/抜ける return 0; } このように if の条件式の真偽を反転する事でまたソースの記述や見易さなどが変ります。 ・以上。goto 文も時には便利ですよ。あまり使用頻度はありませんがね。
その他の回答 (6)
- sgwjn
- ベストアンサー率70% (47/67)
私がこの処理をコーディングするのであれば、 scanf("%d %d",&a,&b); //(1) if(a == 1 && b == 1){ //ここの条件は今適当に付けた ret = jump(); if(ret != 1) ~~; //ここで(1)の処理に戻りたい。go to文以外で。 } この部分をモジュール化してmain()で再帰させます。 個人的には、goto文は特定の処理をスルーさせるため程度にしか使用しません。ラベルをgoto以前に書くことはほぼないです。 また、goto以外で似たようなことができるのであれば、それを使いたいと仰っていますが、gotoを使うなというのは、基本的にジャンプ系の処理を使うなということで、breakやcontinueも含まれます。ですので、gotoを避けても、似たような構文を使用していては意味がありません。 ただ、他の回答者の方々も仰っていますが、これらの構文は扱い方によってはとても綺麗なコードを書くことができます。ようするに、使ってはいけないのではなく、使い方に注意しなければいけないということです。 もし、goto文を使わずに汚いコードを書くくらいなら、goto文を使って綺麗なコードを書くべきです。 http://ameblo.jp/argv/entry-10020978008.html 上記URLには、goto文に対する一つの考え方が書かれています。この考え方は、個人的に非常に共感できます。
- jacta
- ベストアンサー率26% (845/3158)
よいソースコードというのは、(コメントがなくても)コードを見ただけで理解できるように書くものです。 その意味では、本来ループではなく、エラー発生時の再試行や中断であるにもかかわらず、while文やdo文などの繰返し文を使うのは、ソースコードが読みにくくなります。 そんな場合は、素直にgoto文を使った方が、何かただならぬ事態が発生した状況についての記述であることが、視覚的にも明確になりますね。
- Tacosan
- ベストアンサー率23% (3656/15482)
構文はないけど, 自分だったら 1.do~while () でループ 2.while (1) で無限ループ作って適宜 break 3.あきらめて goto かなぁ. 「むやみに goto を使う」のはよくないけど, 「むやみに goto を排除する」のもよくないと思う. だいたい, これだけ goto を使わないようになると「ラベルがある」だけで注意をひきそうな気がするから, やむをえない (ループ系の構文がうまくはまらない) と思えば goto も選択肢に入れていいと思う. まあ, (あとで) 見る人が「goto 撲滅論者」だったりすると困るし, 「なんでそこで goto 使ってるの」という質問にもきちんと答えられるようじゃないといけないと思うけど.
- jacta
- ベストアンサー率26% (845/3158)
go to文ではなくgoto文ですね。 今回の事例では、すでに回答が出ているようにdo文を使えば解決できます。しかし、いつもそうとは限りませんね。 goto文を使わない方がよいというのは、ソースが読みにくくなるからです。にもかかわらず、goto文を使わないこと自体を目的にしてしまうと、goto文を使ったときよりソースが読みにくくなることが多々あります。 どんなときにgoto文を使い、どんなときに使うべきではないかを見極めるには、まずgoto文を使いこなせるようにならなければなりません。昔からプログラミングに携わっている人であれば、アセンブリ言語やらBASICやらで、(名前や構文は違っても)goto文に相当するものを使いこなしていましたから、適切に判断ができるのですが、goto文を使ったことがないと、本当に必要なときにもその判断ができませんね。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★do-while 分を使えば。 int main( void ) { int a, b, ret; do { scanf( "%d %d", &a, &b ); if ( a == 1 && b == 1 ){ ret = jump(); } else{ break; } } while ( ret != 1 ); return 0; } 以上。
- 6dou_rinne
- ベストアンサー率25% (1361/5264)
go toを使うなというのは go to を使うことでスパゲティプログラムになりやすいので使わないでよいようなプログラミングをしなさいということですが。