プロが教えるわが家の防犯対策術!

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←

A 回答 (5件)

No.2 です。



> for文を2つ一気に抜ける場合にはどうしたらいいんでしょうか?

この場合は、素直に goto 文を使うか、No.1 さんのようにフラグで制御するしかないでしょう。

私はC言語実務経験20年以上ですが、goto 文について言えば、「無闇やたらに使うべきではないが、使うべき所で使うのをためらってはいけない」ということです。
よく、「何が何でも絶対に goto は使うな!」と言う人がいますが、これは間違っています。
たった1個の goto 文を避けるために、フラグなどを組み合わせて複雑怪奇な構造にすることの害の方が、余程大きいです。
    • good
    • 3
この回答へのお礼

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

お礼日時:2004/11/10 22:33

内側のループの処理をサブルーチンにしてしまうという手も。



こんな感じ。

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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/11 15:05

この例だと、1のbreakでforループを抜けるので、問題ないですね。

breakは中カッコを抜けるのでなく、for/while/switchから抜けるものです。

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

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

お礼日時:2004/11/10 22:29

> break文でループを一気に(2個以上)抜けたい場合は



このプログラムでは、ループは for 文一つしかありませんが…
したがって、このままで 1 から 2 に抜けます。
(if 文は、ループではないので、1 の break で if を抜けるわけではありません。for を抜けます。)

これをコンパイルして実行すると、「12345afinish」と表示されます。
これで、お望みの動作ではないのでしょうか??
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/10 22:08

gotoを使った方がスマートですが、こんな感じでしょうか。


・ifのあと何もないのなら、breakの前にi=10;を入れてforループを抜けさせる。
・または、int flag;としておいて、forの前でflag=0;と初期化、breakの前にflag=1;でフラグを立てて、ifのあとで、if(flag==1)break;でforを抜ける。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/10 22:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A