
A 回答 (10件)
- 最新から表示
- 回答順に表示
No.10
- 回答日時:
普通は素直にgotoでしょうか。
用途が多重ループの脱出のみであれば、使用しても問題ないでしょうしね。
そもそも、gotoを使うなという言葉の真意は、不用意に処理の流れを歪めるジャンプ系の処理を使うなってことでしょう?
その癖breakやcontinueなんかは当たり前のように使って、gotoだけ目の敵にするのも不思議といえば不思議です。
breakやcontinueが許容されるのであれば、同様の影響範囲でのみgotoを使用すれば良いだけの話です。
No.9
- 回答日時:
#7です。
お説ごもっともですが、そもそもループを途中で抜けなくてはならなくなった時点で「角を矯める」話なわけで、それをどうするかはケースバイケースでしょう。
関数にしてreturnで脱出する方法は私もよく使いますし、きれいに書けることも多いですが、「角を矯めていない」かというと、そうとはいいきれないかと。
ダイクストラの提唱では、そもそもループの途中での中断に対して否定的であったと思います。
No.8
- 回答日時:
分かってるとは思うけど, 本質的に 2重ループなら 2重ループとして記述するのが正しい>#7. 「break で抜け出すために本来 2重ループで書くところを 1重にする」というのは「角を矯める」論だと思います. 「ループ条件を変える」とか「(for の場合に) 制御変数の値をいじる」というのもそれに近いかな.
可能なら「関数にして return で脱出」はきれいですね.
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.5
- 回答日時:
基本はgotoですね。
C++なら例外で抜けるという手もありますが、基本はやはりgotoです。
gotoで済むものを、フラグを使ったりループカウンタを小細工すると、かえってバグの原因になります。
No.4
- 回答日時:
フラグを使って毎回 break ってのも考えられなくはないけど.... goto が最も素直でしょう.
というか, プログラムを素直に書くためには goto 以外の選択肢はない.
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は御法度です。分かっててやるのは良いですが初心者には勧められません。
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は、無条件ジャンプなので、
スパゲティプログラムとなります。
以上、ご参考になりましたら幸いです。
No.1
- 回答日時:
ループはプログラムの根本的な構造のひとつなので、むやみに条件を無視してループを抜けるようなコードを書くと後で泣きを見ますよ。
どうしてもやるんなら・・・goto文を使うくらいでしょうかね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCの終了の仕方
-
VBAでの一時停止と再開の方法
-
Do whileでExitせず、ループの...
-
テキストボックスの名前に変数...
-
VB.NETでFTPプログラム
-
xmplayの使い方
-
C言語でファクト関数を使わずに...
-
csh foreachで「*」でエラ...
-
ListBox 複数選択 で オートフ...
-
ループフリー
-
UWSCに制限時間を付けたいです
-
プログラミングで難しいと感じ...
-
EXCEL VBA(初心者)印刷ルー...
-
CSVファイルの特定の行だけを読...
-
エクセルの当番表を作っていま...
-
vb.netからエクセル関数書き込み
-
VBAで3秒だけ時間を止めたい
-
Excel VBAでIf 条件式 then か...
-
流れ図(フローチャート)が分か...
-
Dim flag(4) as boolean で配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
VBAでの一時停止と再開の方法
-
Escキーを押すと、中断する時と...
-
乱数の桁数指定、または範囲指定。
-
イベントの発生を待つ
-
流れ図(フローチャート)が分か...
-
UWSCに制限時間を付けたいです
-
vb.netです。2次元配列の要素を...
-
VBA for i=1 to lastrow
-
DoEventsが必要な理由について
-
ループフリー
-
VBA Boxが空白の場合のメッセー...
-
VBA ニュースタイトル取得
-
エクセルの当番表を作っていま...
-
Javaの質問です。 この問題の答...
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
おすすめ情報