
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語について 4 2022/07/02 01:08
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
- Visual Basic(VBA) For~Nextステートメントの終了条件について 1 2023/01/08 18:36
- その他(悩み相談・人生相談) 風俗通いを辞めたい。 風俗行って散財しては気分が沈んで鬱みたいになって、給料でたら、また風俗行って散 7 2023/03/14 21:38
- Java Java 南京錠 2 2023/02/04 11:46
- Y!mobile(ワイモバイル) XPERIA 1 iiが水没してしまったのですが、復旧しますか? 再起動ループをしてしまっています。 3 2023/05/31 10:19
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
gccを行ってもexeファイルが生...
-
c言語
-
visual studio 2022でのC#プロ...
-
C# DatagridviewにExcelシート...
-
mallocについて
-
C言語って古いですか?
-
C言語関数違いについて。
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
パソコン
-
CPUが16bitでも32bitOSでコンパ...
-
Python、プログラミングについ...
-
だれがとけるの?
-
バッチファイルで以下のような...
-
Notepad++の関数リスト表示の変...
-
VisualStudio2022でC言語プログ...
-
License='MIT' ってなんでmitな...
-
C言語 ストリームについて。
-
c言語でイベントフラグを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報