• ベストアンサー

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←

noname#12136
noname#12136

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

  • ベストアンサー
  • 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% (4848/10261)
回答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

  • for文~break

    break文に達した時、for文から抜けますか?それとも、if { }から抜けるんですか? for文はどこまで影響下にありますか? if ( i==5 ) printf ("サーバーが見つかりません"); まででしょうか? また  if ( i == 5 ) で5なら、実行としていますが、 6,や,8など5 以外でも、サーバーが見つかりません と if文が実行される見たいですが、なぜですか? 教えてください。 #include<stdio.h> int main(void) { int array[5][2]={ {1,14}, {2,28}, {3,19}, {4,8}, {5,15}, }; int sever; int i; printf("番号を入力してください"); scanf("%d",&sever); for( i=0 ; i<5 ; i++ ) if ( sever == array[i][0] ){ printf ( "%d 番には, %d 人います。\n",sever,array[i][1]); break; } if (i==5) printf("サーバーが見つかりません"); return 0; }

  • break文の処理について。

    #include<stdio.h> #define MAX 1000 main(){ int i = 0; int sum = 0; int ary[MAX]; puts("整数を入力してください"); ----------------------------------------- while(i < MAX){ printf("No.%d:" , i+1); scanf("%d" , &ary[i]); if(ary[i] == 9999){ i++; break ; } sum += ary[i]; i++; } ------------------------------------------ if(i > 1){ printf("合計は%dで平均は%.2fです\n" , sum , (double)sum/(i-1)); } return; } -------で区切っている部分になりますが、 配列aryの値に9999が入ると、breakでifとwhileのループを抜けることになりますが、 ここのbreakについては、ifだけにかかるのではと思っております。 このソースが書いてある解説には「多重ループの繰り返し文の内側の繰り返し文の中で、 break文が使われるとその繰り返し文から抜け出ることになります。」と記載されており ます。 多分ですが、ifは繰り返し文ではないため、whileを抜け出すことができるのではと 思っているのですが、確認のためご教授の程お願い致します。

  • if・・・break文について教えて下さい♪

    ---------------------------------------------------------------- public class A { static int prime(int number){ int count=0; for(int i=1; i<=number; i+=2){ if(number%i==0) count++; } return count; } } ----------------------------------------------------------------  上に書いたプログラムのprime()メソッド内に、if…break文を使いたいのですが、どう書いたらイイのですか??  上のプログラムをコピーしてからif…break文を付け加えて欲しいです★

    • ベストアンサー
    • Java
  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓

  • java break文とラベル

    ・for文から合計の数値が1000を越えたら処理を終了するコードを削除する。 ・for文を10回繰り返すfor文を作る。 ・for文で値を1~100まで足したら値はりせっとせずに保持する。 (for文は1~100までを足すと5050になるので、5050にさらに1➕2➕3…と数を加算していく) ・加算結果の数値が20000を越えたら、全ての処理を終了する。 ・終了にはbreak文とラベルを使用する。 以上の条件の作成ができません。 public static void main(String []args){ outside : for(int n = 1: n <= 100; n++){ for(int a = 1; a <= 100; a++){ int i = 1; i += a; if(i > 20000){ break outside; } System.out.println(i); } } } } までは出来ました。 出力結果が1~19900までなりません。 どうしたらその結果になるのかわかる方教えてください。 お願いします。

  • forループに慣れるには

    初めまして。 今資格を取ろうと思い独学でJavaを勉強してるんですが、 つまらない部分でつまずいています。 それは少々複雑なfor等のループです。 変数を追っていくうちにこんがらがってしまい、 変数の正しい値を見失ってしまいます。 例えば… Loop: for(int i = 0; i<5; i++) { for(int j =0; j<5; j++) { if(i==j) continue Loop; System.out.println("i = " +i+ "j = " +j); if(i > 3) break Loop; } } や、 int i,j; for(i = 0, j = 0; i<3;) { if(i++ == 2 || j++ == 2) break; } System.out.println(i); System.out.println(j); の様なループです。 試験範囲は大方勉強出来てるんですが まぬけな事にループがイマイチ理解出来てなくて(恥) 皆さんはどうやって慣れてこられましたか? つまらない質問ですが何か良いコツやアドバイスがあれば よろしくお願いします。

  • for 3ループについて教えて

    for 3ループについて教えて * ** *** **** * ** *** **** * ** *** **** と表示させたいのですが、 #include<stdio.h> int main(void) { int i,j,k; for(i=1; i<=4; i++) { for(j=1; j<=i; j++){ // for(k=1; k<=3; k+=i){ } printf("*"); } printf("\n"); } return 0; } * ** *** **** このように表示されてしまいます。//の所が違うなと思います。が、分かりそうで分かりません。 もし、分かるかたがいましたら、教えてください。 よろしくおねがいします。

  • 永久ループ・・・

    どうも、最近C言語の勉強を始めた超初心者です。 int main(void) { int i; for(;;){ printf("桁数を入力してください。:"); scanf("%d",&i); if(i<=12) break; else puts("もう一度入力してください。"); continue; } return(0); } 上のソース、i<=12の条件を満たさなければループを繰り返すというプログラムなんですけど、数値を入力した場合は思った通りに挙動するのですが、文字や文字列を入力すると永久ループになります。scanf関数で返値を受け取って判定するなどいろいろ試したのですが、どうしても永久ループになってしまいます。 どうしてか教えてください。お願いします。

  • ご教示ください。

    ご教示ください。 javaのfor文を用いたループ処理についてです。 for( int i = 0; i < 10; i++){ System.out.print( i ); if ( i == 3){ break; } 結果 0123 ----------------------------------------------- for( int i = 0; i < 10; i++){ if ( i == 3){ break; } System.out.print( i ); 結果 012 後者の、012になる結果はわかります。 breakをすることで、3以降のループ処理から離脱するということは理解できるのですが、前者が理解できません。 0123 なぜ、3が表示されているのでしょうか。 よろしくお願いいたします。

  • 10進ベーシックでループを抜けたい

    for文で作った2重ループの中にif文があります。 if文の条件を満たしたらループを抜けるようにしたいのですが、 「goto 行番号」や「EXIT FOR」 を使ってもうまくいきません。 一度に2重ループを抜けたいのですが、どうすればいいでしょうか?

専門家に質問してみよう