C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 2重ループの内側を抜けたい


(過去ログ 88 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■52246 / inTopicNo.1)  2重ループの内側を抜けたい
  
□投稿者/ ダブルーパー (1回)-(2010/08/04(Wed) 11:16:21)

分類:[VB.NET/VB2005 以降] 

For
    ' 処理
    While
        ' 処理
        If
             ' この位置で While ループを抜け For ループを続行したい。
        Then
        ' 処理
    End While
' ここには何の処理もない
Next

上記コードの「この位置」には下記のいずれを書いても同じ動作をしますが、どちらがよいとか悪いとかありますか?
Exit While
Continue For

「何の処理もない」部分に何らかの処理を追加する可能性があるならばそれを通りたいかどうかで分けるのでしょうが、そのような予定はありません。

(これは解決しなくてもよい疑問ですが、C系では continue や break がループの種類によらないようですが、処理追加があってそれを通りたくない場合はどうするのでしょうか。)

引用返信 編集キー/
■52251 / inTopicNo.2)  Re[1]: 2重ループの内側を抜けたい
□投稿者/ よねKEN (566回)-(2010/08/04(Wed) 13:07:56)
よねKEN さんの Web サイト
> 上記コードの「この位置」には下記のいずれを書いても同じ動作をしますが、どちらがよいとか悪いとかありますか?
> Exit While
> Continue For

提示の状況であれば「Exit While」を使うべきだと私は思います。

> 「何の処理もない」部分に何らかの処理を追加する可能性があるならばそれを通りたいかどうかで分けるのでしょうが、

そうですね。

> (これは解決しなくてもよい疑問ですが、C系では continue や break がループの種類によらないようですが、
> 処理追加があってそれを通りたくない場合はどうするのでしょうか。)

Continue 〜(continue相当)にしてもExit 〜(break相当)にしても、個人的には無闇やたらと使うものじゃない、と思います。
ミニマムな機能を持ったメソッド(関数)の集合として、大きな機能を作るようにしていれば、
そういった複雑な条件分岐そのものを回避できるものがほとんどだと思います。
引用返信 編集キー/
■52253 / inTopicNo.3)  Re[1]: 2重ループの内側を抜けたい
□投稿者/ 通りすがり (66回)-(2010/08/04(Wed) 13:10:00)
No52246 (ダブルーパー さん) に返信
> 上記コードの「この位置」には下記のいずれを書いても同じ動作をしますが、どちらがよいとか悪いとかありますか?
> Exit While
> Continue For
>
結果が同じなら、プログラムを読んでいって「Whileを抜ける」と読むのが適しているか「次のForループを実行する」と
読むのが適しているか、で判断すればいいのではないでしょうか。

より文脈に適したステートメントを選択するのが可読性向上につながります

> (これは解決しなくてもよい疑問ですが、C系では continue や break がループの種類によらないようですが、処理追加があってそれを通りたくない場合はどうするのでしょうか。)

while(..) {
 while(..) {
   :
  if(..) break;
   :
 }
 hoge(); ←breakしたあとにはこれを実行したくない
}

ということですか?
・whileの継続条件を使って分岐
・breakするときにフラグを立てておいて分岐
・breakじゃなくてgotoでhoge()の後に抜ける
等々状況によっていろいろ方法はあると思います
引用返信 編集キー/
■52261 / inTopicNo.4)  Re[1]: 2重ループの内側を抜けたい
□投稿者/ みきぬ (943回)-(2010/08/04(Wed) 15:14:08)
…ん? 質問の意図って、こういうこと?

For
    ' 処理
    While
        ' 処理
        If ほにゃらら Then
             ' この位置で While ループを抜け For ループを続行したい。
        End If
        ' 処理
    End While
' ここには何の処理もない
Next

引用返信 編集キー/
■52300 / inTopicNo.5)  Re[2]: 2重ループの内側を抜けたい
□投稿者/ ダブルーパー (2回)-(2010/08/05(Thu) 10:58:23)
While 文の挙動をよく見たら For..Next でより簡潔に書けたので内側のループを For..Next に変更し、その結果 Exit For を使うことになりました。
なお、同じ動作を Python では for 文の後の else 節で書けました。


> 52251

> 提示の状況であれば「Exit While」を使うべきだと私は思います。
ありがとうございます。

> Continue 〜(continue相当)にしてもExit 〜(break相当)にしても、個人的には無闇やたらと使うものじゃない、と思います。
> ミニマムな機能を持ったメソッド(関数)の集合として、大きな機能を作るようにしていれば、
> そういった複雑な条件分岐そのものを回避できるものがほとんどだと思います。
その通りですね。今回のコードも2画面を超えるようになってきたので、そろそろ切り分けてやろうかというところです。


> 52253

> 結果が同じなら、プログラムを読んでいって「Whileを抜ける」と読むのが適しているか「次のForループを実行する」と
> 読むのが適しているか、で判断すればいいのではないでしょうか。
> より文脈に適したステートメントを選択するのが可読性向上につながります
ありがとうございます。今回の例ではまさに等価だったので、より単純に記法的な問題としてお尋ねしました。

>  hoge(); ←breakしたあとにはこれを実行したくない
そういうことです。やはり2重ループを一気に抜ける場合などに似た解決のしかたになるのですね。
(蛇足ですが Exit や break でググっていたら PHP では break n で n 重のネストを抜けられるという便利な仕様を見つけました。ちょっとうらやましく思いました。)


> 52261
> …ん? 質問の意図って、こういうこと?
その通りです。
読み返して書き間違いに気づきました。申し訳ありませんでした。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -