プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (10件)

普通は素直にgotoでしょうか。


用途が多重ループの脱出のみであれば、使用しても問題ないでしょうしね。

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

#7です。


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

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


可能なら「関数にして return で脱出」はきれいですね.
    • good
    • 0

みなさんおっしゃる方法のほか、そもそも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;
}
}
とするとか。
    • good
    • 0

 


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

基本はgotoですね。


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

フラグを使って毎回 break ってのも考えられなくはないけど.... goto が最も素直でしょう.


というか, プログラムを素直に書くためには goto 以外の選択肢はない.
    • good
    • 0

・ループ内部を関数にしておいて、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は御法度です。分かっててやるのは良いですが初心者には勧められません。
    • good
    • 0

方法はいくらでも有りますよ。



// ■例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は、無条件ジャンプなので、
スパゲティプログラムとなります。

以上、ご参考になりましたら幸いです。
    • good
    • 0

ループはプログラムの根本的な構造のひとつなので、むやみに条件を無視してループを抜けるようなコードを書くと後で泣きを見ますよ。



どうしてもやるんなら・・・goto文を使うくらいでしょうかね?
    • good
    • 0

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