• 締切済み

多重ループの抜けだし方

for文などの2重ループや3重ループの抜け出し方を教えてください。 breakは最も内側のループしか抜け出せないんですよね?

  • n1079
  • お礼率60% (70/115)

みんなの回答

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.10

普通は素直にgotoでしょうか。 用途が多重ループの脱出のみであれば、使用しても問題ないでしょうしね。 そもそも、gotoを使うなという言葉の真意は、不用意に処理の流れを歪めるジャンプ系の処理を使うなってことでしょう? その癖breakやcontinueなんかは当たり前のように使って、gotoだけ目の敵にするのも不思議といえば不思議です。 breakやcontinueが許容されるのであれば、同様の影響範囲でのみgotoを使用すれば良いだけの話です。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.9

#7です。 お説ごもっともですが、そもそもループを途中で抜けなくてはならなくなった時点で「角を矯める」話なわけで、それをどうするかはケースバイケースでしょう。 関数にしてreturnで脱出する方法は私もよく使いますし、きれいに書けることも多いですが、「角を矯めていない」かというと、そうとはいいきれないかと。 ダイクストラの提唱では、そもそもループの途中での中断に対して否定的であったと思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

分かってるとは思うけど, 本質的に 2重ループなら 2重ループとして記述するのが正しい>#7. 「break で抜け出すために本来 2重ループで書くところを 1重にする」というのは「角を矯める」論だと思います. 「ループ条件を変える」とか「(for の場合に) 制御変数の値をいじる」というのもそれに近いかな. 可能なら「関数にして return で脱出」はきれいですね.

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.7

みなさんおっしゃる方法のほか、そもそも2重ループにしないという方法もありますね。 例えば、 for(y=0;y<10;y++){ for(x=0;x<10;x++){ if(xxx)goto label; } } label: となっているところを、 x=0; y=0; while(xxx){ x++; if( x == 10 ){ x=0; y++; if( y == 10 )break; } } とするとか。

回答No.6

   処理の内容によっては、関数にして"retrun"するとか。  

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

基本はgotoですね。 C++なら例外で抜けるという手もありますが、基本はやはりgotoです。 gotoで済むものを、フラグを使ったりループカウンタを小細工すると、かえってバグの原因になります。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

フラグを使って毎回 break ってのも考えられなくはないけど.... goto が最も素直でしょう. というか, プログラムを素直に書くためには goto 以外の選択肢はない.

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

・ループ内部を関数にしておいて、return する --- loopfunc() {  for (i = 0; i < 10; i++) {   for (j = 0; j < 10; j++) {    if (cond) return;   }  } } main() {  …  loopfunc();  … } --- 必要な変数の受け渡しなどに手間がかかるのが欠点。 構造は一番シンプルです。 ・ループ条件にフラグ変数を入れておき、抜けたい時にはフラグ変数に代入 --- main() {  …  for (i = 0; i < 10 && loopexit == 0; i++) {   for (j = 0; j < 10 && loopexit == 0; j++) {    if (cond) loopexit = 1;   }  }  … } --- ループ条件が複雑になるのが欠点。 ・goto で抜ける --- main() {  …  for (i = 0; i < 10; i++) {   for (j = 0; j < 10; j++) {    if (cond) goto loopexit;   }  }  loopexit:  … } --- 「構造化プログラミング」的にはgotoは御法度です。分かっててやるのは良いですが初心者には勧められません。

  • rinmane
  • ベストアンサー率56% (64/113)
回答No.2

方法はいくらでも有りますよ。 // ■例1 for ( i=0; i<10; i++ ) {   for ( j=0; j<10; j++ ) {     if ( 条件 ) {       i = 10;       break;     }   } } // ■例2 i = 0; loop = true; do {   for ( j=0; j<10; j++ ) {     if ( 条件 ) {       loop = false;       break;     }   }   if ( loop ) i++; } while ( loop ); ※もちろんdo whileではなく、whileだけで制御するのも有りです。 例1の方法は思わぬバグの元になるので、 あまりお勧めではないですが…結構使うことも有ります。 ちなみにgotoは、無条件ジャンプなので、 スパゲティプログラムとなります。 以上、ご参考になりましたら幸いです。

  • ESE_SE
  • ベストアンサー率34% (157/458)
回答No.1

ループはプログラムの根本的な構造のひとつなので、むやみに条件を無視してループを抜けるようなコードを書くと後で泣きを見ますよ。 どうしてもやるんなら・・・goto文を使うくらいでしょうかね?

関連するQ&A

  • objective-cの多重ループbreak

    objective-cの多重forループの内側でbreakすると外のforまで抜けるようです。 では、内側のforだけ抜けて外側のforの中に戻るにはどう書けばいいのでしょうか? あと、この件について、c言語とobjective-cの文法の違いについて教えていただけるとうれしいです。

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

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

  • 多重ループの抜け方

    例えば2重ループで、内側のループと外側のループも抜けたいとき、 while(true){  boolean flag = false;  …  while(true){   if(/* ある条件を満たした時 */) {    flag = true;    break;   }  }  if(flag){ break; } } としているのですが、このループが3段、4段になるときもこのような方法しかないのでしょうか?C言語のgotoみたいなことはできないですよね・・? (goto自体使わない方がいいと言われていますが・・)

    • ベストアンサー
    • Java
  • C言語における3重ループの定義についての質問です

    多重ループの定義について for文の中にfor文がある場合、多重ループになることはわかったんですが、 3重ループ以上の場合は for文の中にfor文があり、さらにその中にfor文がある時ですか? 例 for( ){ for( ){ for( ){ } } } それとも、for文が重なっている時のfor文の合計数ですか? (例えばfor文の中に別々のfor文が2つある場合) 例 for( ){ for() { } for( ){ } } 上手く説明できないんですが、よろしくお願いします

  • ループについて

     アンケート的な質問ですが、forの無限ループと、whileの無限ループが、C言語にはありますよね?  whileの場合は、while(1)と書きますし、問題ないですが、 forの場合は、for(;;)とかきますよね。  forの無限ループって、顔文字の涙にみえないですか? for文の無限ループって、何が悲しかったのでしょうか? 答えられる方、こたえてください。

  • 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←

  • 入れ子ループで、外側のループ変数$_を、内側のループ内から使えるか??

    入れ子ループで、外側のループ変数$_を、内側のループ内から使えるか?? ループ変数を指定しない場合、自動的に$_が使われますが、例えば、 BIG: for(0..9) { SML: for(0..9) { expr } } のようなステートメントを書いた場合、SMLループ内でBIGのループ変数$_を参照する手だてはあるのでしょうか? イメージ的には、 $BIG::_ とやれば、出来そうだと思ったのですがダメでした^^; ださいコードでスミマセン m(__)m;;

    • ベストアンサー
    • Perl
  • 無限ループとループ文

    プログラミングにおいて while文、for文、foreach文などループ文は種類がありますが 無限ループに繋がってしまう恐れが高い順などは存在しますか? どのループ文もミスなく慎重に 正確な書き方さえしていれば無限ループは起きないと思いますが もしそのような順が存在するのであれば、わからないので教えて頂きたいです。

  • 多重ループから例外で抜け出すやり方について

    PHP5.2.4を使用しています。 次のような複数の箇所で多重ループから抜け出すきっかけになる処理(function1()、function2())を散らばせて 記述している場合、自分としてはメソッドから返ってきたフラグを判定してbreak 2;とかするよりは 例外(throw)を使って抜け出す方法がいいのかなぁと思ってるのですが、 そもそも例外というものはこういう風に使ってもいいのでしょうか? それともこのケース($valueが0以下になったら)では別のやり方の方があるのでしょうか? class Class1 { private $value = 100; public function subValue($value) { $this->value -= $value; if ($this->value <= 0) { throw new Exception('valueが0以下になった'); } } public function function1() { $this->subValue(30); } public function function2() { $this->subValue(50); } public function main() { try { for ($i = 0; $i < 3; $i++) { $this->function1(); for ($j = 0; $j < 3; $j++) { $this->function2(); } } } catch (Exception $e) { print $e->getMessage()." [".__FILE__ ."(".__LINE__.")]<br>\n"; } } } $obj = new Class1(); $obj->main();

    • ベストアンサー
    • PHP
  • UWSCでの多重ループ

    最近プログラムを組み始めた初心者です。 メインのAというループの中にもう一つBというループを作り、Bの条件が満たされたら又Aのループに戻る というスクリプトを書きたいのですがどのようにすればよいでしょうか? While~Wendでいけると思ってやってみたのですがなかなかうまくいきません。 どなたか手ほどきをよろしくお願いします。 ループA(メインループ)←←                ↑                ↑    ループB(サブループ)この中の条件が満たされた時ループAに戻る方法    ループB終わり ループA終わり

専門家に質問してみよう