• ベストアンサー

break文でループを一気に抜けるには

break文でループを一気に(2個以上) 抜けたい場合はどのようにすればいいのでしょうか? たとえば下のプログラムで1から2に抜けたい すなわちifとforの2つの中括弧を同時に抜けたい場合には どうやってbreak文を記述すればいいのでしょうか? (goto文は使わないということでお願いします。 int k=0; int i; for (i=1;i<10;i++){   k++;   printf("%d",k);   if (k == 5){     printf("a");     break;・・・・・・・・・1→   } } printf("finish");・・・・・・・・・2←

質問者が選んだベストアンサー

  • ベストアンサー
  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.4

No.2 です。 > for文を2つ一気に抜ける場合にはどうしたらいいんでしょうか? この場合は、素直に goto 文を使うか、No.1 さんのようにフラグで制御するしかないでしょう。 私はC言語実務経験20年以上ですが、goto 文について言えば、「無闇やたらに使うべきではないが、使うべき所で使うのをためらってはいけない」ということです。 よく、「何が何でも絶対に goto は使うな!」と言う人がいますが、これは間違っています。 たった1個の goto 文を避けるために、フラグなどを組み合わせて複雑怪奇な構造にすることの害の方が、余程大きいです。

noname#12136
質問者

お礼

あ~すっきりしました。goto文はそういう意味合いがあったんですね。 勉強になりました。どうもありがとうございました。

その他の回答 (4)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.5

内側のループの処理をサブルーチンにしてしまうという手も。 こんな感じ。 for(i = 0 ; i < 10 ; i++){  if(sub(i) == -1){   break;  } } int sub(int i) {  for(i = 0 ; i < 10 ; i++){   if(......){    return -1;   }   //処理  }  return 0; }

noname#12136
質問者

お礼

サブルーチンですか。どうもありがとうございました。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

この例だと、1のbreakでforループを抜けるので、問題ないですね。breakは中カッコを抜けるのでなく、for/while/switchから抜けるものです。 二重になったforやwhileループから抜け出すのであれば、普通はgotoを使うのがベストだと思います。 gotoを省くためには、新たにフラグ用の変数を設定したり、途中をスキップするif文を設けたりしてプログラムが読みにくくなりますから止めたほうが良いでしょう。 まれにgotoなしでも読みやすいプログラムが書ける場合もあります。

noname#12136
質問者

お礼

break文についてあいまいにおぼえていたようです。 勉強になりました。ありがとうございます。

  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.2

> break文でループを一気に(2個以上)抜けたい場合は このプログラムでは、ループは for 文一つしかありませんが… したがって、このままで 1 から 2 に抜けます。 (if 文は、ループではないので、1 の break で if を抜けるわけではありません。for を抜けます。) これをコンパイルして実行すると、「12345afinish」と表示されます。 これで、お望みの動作ではないのでしょうか??

noname#12136
質問者

お礼

このプログラムは思いつきで書いてみたものなのでまさか実行できるとは思いませんでした。 break文はfor文を抜くためのものなんですね。よくわかりました。ありがとうございます。 ただ、for文を2つ一気に抜ける場合にはどうしたらいいんでしょうか? (お礼のところに質問を書いてしまってすいません。)

回答No.1

gotoを使った方がスマートですが、こんな感じでしょうか。 ・ifのあと何もないのなら、breakの前にi=10;を入れてforループを抜けさせる。 ・または、int flag;としておいて、forの前でflag=0;と初期化、breakの前にflag=1;でフラグを立てて、ifのあとで、if(flag==1)break;でforを抜ける。

noname#12136
質問者

お礼

確かにgotoを使ったほうがスマートですね。 でもgotoは禁じ手と聞いたことがあるのであんまり使いたくないんですよね^^; ご回答どうもありがとうございます。

関連するQ&A