- ベストアンサー
ループ内での条件処理
ループ内で、ある条件の時だけ処理をする場合は、どういう書き方しますか? 例えば、私は while(ループ条件) { if (判定==false) continue; 処理 } ってやります。
- Java
- 回答数7
- ありがとう数3
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
私なりに質問の意図を汲み取り回答します。 continueを使うか入れ子にするかの2択を迫られた場合、どちらを選択しても論理的な構造は変わりません。これは絶対前提条件です。その上でcontinueを使うのが嫌いか、入れ子を嫌うかの違いにすぎません。 両者のメリットとデメリットを考えた場合、 continueを使う場合、入れ子が少なくできる continueを使わない場合、使用する命令の種類を減らすことができる 位しかありません。 これ以外の理由で何か議論をしている場合、中身の無い屁理屈でしかないように思えます。 で、continueを使わないことと入れ子を減らすことのどちらがよりよいかと言う話になりますが、私はcontinueを使う方が好きです。私はcontinueを使うことに抵抗はありませんし、入れ子を減らすほうが表記上の構造がシンプルになり単純な可読性が向上しますので。 しかし、複数の人がかかわる開発などでは、優れた構造のプログラムが必ずしもよいわけではありません。 例えば正規表現は文字列操作のために用意された機能ですが、これを習得していない技術者も少なくありません。正規表現を使えば1行ですむ処理を何十行も書いて処理をする汚いソースはよく存在します。正規表現がわかる人にとっては正規表現を用いて1行で記述してくれたほうがずっとわかりやすいし、構造的にも優れていることは間違いありません。しかし、正規表現がわからない人にとっては、読めないソースになってしまいます。 それと同じようなことがこの件についても言えます。continueは全ての言語に共通する命令ではありません。また、違和感を感じる人や読みにくいと感じる人もいるでしょう。そのような人が読む可能性のあるチームであえてcontinueを使うのであれば、それは人が読めないソースを書いていることになります。 「人が読めないソース」がいいソースであるはずがありません(まぁ読めない人には少し勉強してほしいものですが…)。 ケースバイケースであると思います。
その他の回答 (6)
#1です。 回答は出ているようですが一応自分の回答に補足しときます。 補足要求した理由は、質問文だけでは「全くの初心者」なのか「少しは知ってる人」なのかの判断がつかなかったからです。 「初心者が Java の文法を勉強するために質問している場合」と「中級者が他者のソースのトレースをやりたがっている場合」とでは回答が全く変わってしまいます。 なので、あなたががある程度以上のレベルの人だと最初から分かっていたなら、俺も他の方と同じように「Java の条件判断文は if と switch しかありませんので、あとはフリーフォーマット方式を採用している関係で違って見えるくらいのバリエーションしかありません」と答えたでしょう。 ちなみに質問文の中に例として載せてある構文であれば、 while ( (data = get()) ) { if ( !data ) continue; process(data); } という書き方をします。 判定はできるだけイコールを使わずに判定し、ループ内で使用するデータは while 文の中で取得するように心がけています。また、ブロック文がいらないケースでは if に中括弧は使いません。 これは「何例かの決まりきった構文を使う場合、1文字でも少ない方がトレーサビリティは向上するはずだ」という俺のポリシーによるものです。
最初、質問を読んだときよく意味がわからなかったんですが、補足で意味がわかりました。面白そうなので回答します。 while(ループ条件){ if (判定条件==true) { 処理 } } 私も、これに一票ですね。最初に実行条件に符合しないものを例外的に構文から外に出すやりかたはあまりとりません。 これがループだとどっちでもいい感じがしますけど、サブルーチン(メソッド)などの場合にはかなり印象が違ってきます。例えば、あっちこっちにreturnがいくつもあるような書き方は最悪でしょう。returnは常に最後に1つだけで済む形で書くのが基本ですね。 それと同じように、ループの場合も、例外がいくつもあちこちにある書き方は、後で修正などを行うことになったとき、取りこぼしを誘発する可能性があります。条件が最初にすべてまとめられるのならいいのですが、 while(ループ条件){ if (○○){ continue; } ・・・処理・・・ if (○○){ continue; } ・・・処理・・・ if (○○){ continue; } ・・・処理・・・ } こんな具合に何かの処理をしてから条件に応じて構文を抜け出すような処理になってきた場合、後で条件などが変更されたとき、つい修正の取りこぼしを誘います。 ifでネストされた中に書く方法は、一見すると読みにくそうに思えますが、「どの処理がどの条件内で実行すべきか」が明確にわかり、条件変更などに伴う取りこぼしの可能性を抑制できるように思えます。 while(ループ条件){ if (○○){ ・・・処理・・・ if (○○){ ・・・処理・・・ if (○○){ ・・・処理・・・ } } } これなら、どの条件に符合するときどの処理をすべきかが直感的にわかります。条件の変更が必要となっても修正の取りこぼしをすることはまずありません。改変に伴う修正の取りこぼしなどを考えると、continueを使わないほうがコードとしては安全かな?と思ったりします。
- tatsu99
- ベストアンサー率52% (391/751)
私もその方法をとります。 つまり、本題としてやるべきことは、なるべくif文のNESTのなかでやるのではなく、素直な流れのなかでやる方が、ソースが見やすくなります。また、このようなループのなかで、良くあるケースを最初に除いておくことは、処理のスピードアップにもつながることがあります。
- fortranxp
- ベストアンサー率26% (181/684)
while(ループ条件){ if (判定条件==true) { 処理 } } に一票。 ていうかループ処理ならば 他に選択肢が思いつきません。
- fortranxp
- ベストアンサー率26% (181/684)
あまり良いほうほうではないでしょうが。 while(ループ条件){ if(判定条件==true){ flag=1;} if(flag==0){ 処理A(falseのとき);} else{ 処理B(trueのとき);} flag=0;} } ムダみたいですが自分的には 頭に入りやすいのでつい。 ちゃんと紙にやりたいことを 書いてやればこんなことは ないでしょう。
補足をお願いします。 1.あなたは Java の勉強中ですか? だとすれば、どれくらい勉強しましたか? 2.なぜこのような質問をしなければならなかったのですか? もしくは単に興味本位であれば、なぜそのような興味が沸いたのですか?
お礼
すいません。 逆に、なぜそれが気になったのですか? おかしなことを聞いてしまったでしょうか。
補足
1.Javaは2年くらいやってます。現在も勉強中ですが・・・。 2.色々な人のコードをみてると同じ意味でも違う描き方をしてるので、もっと色々な人のコードを見てみたいと思って質問しました。
関連するQ&A
- while文と無限ループの違い
はじめまして。大学でC++を習い始めたばかりの初心者です。 最近while文とwhile文と使った無限ループを知ったのですが、 両者の違いがイマイチわかりません。 私のイメージですと、while文は条件が真である限り何度でも判定し 条件が偽になればループを抜ける。 一方無限ループもif文を使った条件が真にならない限りbreakしない。 while文の偽と判定する部分がif文で真と判定するだけで、同じような気がするのですが… ド素人の考えで恥ずかしいのですが、違いをわかりやすく教えてください。
- 締切済み
- C・C++・C#
- VB.NET Excelの読み取り(ループ処理)
VB.NETでExcelをループ処理で読み取る際に、While文を使用して1行ずつ読み込む処理をするのですが、皆さんはどのようにして書かれてますか? While文の条件は「空白の行が見つかったらループを辞める」という条件で処理をするのですが、書き方がいまいちピンとこないので、皆様の情報を参考にさせて頂ければと思いました。 ・Excelのデータは約3000~4000件ほど(データによって件数は若干変動) ・Excelの6行目(A:6)から読み込む 是非ともよろしくお願いいたします。
- 締切済み
- Visual Basic
- 【PHP】条件が一致したときだけループを開始
条件によってループを開始したりスル―したりする方法はありますか? if文の中だけで完結するループではなく、ループ文の最初と最後だけをスルーしたいのですが、どうしても方法が思い浮かびません。 if(条件){ 判定 } foreach( ){ ← 判定によってここをスルーしたい print "abcdefg"; ← ここは常に実行したい } ← foreach がスルーされているので、ここも消したい foreachの中身が短ければ、2パターン作ればいいと思うのですが、数千行になってしまっているので、できれば条件によってスルーしたいのですが、そもそもPHPでこれは可能なんでしょうか?
- ベストアンサー
- PHP
- perl:ループのカウンタ変数の値を保持したい。
While文のループのなかにfor文でループをまわしているスクリプトなのですが、 forの中でカウンタ変数をつくり、ループ回数を計測しております。 またforの中である条件を満たした際に、lastでforを抜け、引き続きWhileのループを継続するという処理をしております。 $i=0; While(○○){ 処理1 for(××){ 処理2 $i++; if($i >=100){ 処理3 last; } } } ここで、一度for文のif文で一度forループを抜け、Whileでループをし、またforループに突入した際に、前回forループでカウントした$iの値を保持したまま、そのつづきから$iのカウンタを動作させたいのですが、$iの値はforループを抜けるとリセットしてしまいます。 このような場合、どうすれば$iの値を保持できますでしょうか。 お詳しい方、宜しくお願い致します。 ※ネストがうまく表現できず、みずらくてスミマセン。
- ベストアンサー
- Perl
- 永久ループ・・・
どうも、最近C言語の勉強を始めた超初心者です。 int main(void) { int i; for(;;){ printf("桁数を入力してください。:"); scanf("%d",&i); if(i<=12) break; else puts("もう一度入力してください。"); continue; } return(0); } 上のソース、i<=12の条件を満たさなければループを繰り返すというプログラムなんですけど、数値を入力した場合は思った通りに挙動するのですが、文字や文字列を入力すると永久ループになります。scanf関数で返値を受け取って判定するなどいろいろ試したのですが、どうしても永久ループになってしまいます。 どうしてか教えてください。お願いします。
- ベストアンサー
- C・C++・C#
- PHP プログラム ループ処理
プログラム初心者です、ループ処理についてうまい解決方法が思い浮かばず相談させて頂きます。 ループ処理において、ループ内で変数を定義するのに違う名前を指定するにはどのような方法があるのでしょうか 例えばwhileの場合 $i =0; while($i<10){ $hoge = $i; $i++ } この$hogeを2順目には$hoge1、3順目には$hoge2と言うように増やしたり一定の法則に乗っ取って変数名を変更するにはどのように書けばいいのでしょうか。 どなたかご教授頂ければと存じます、宜しくお願い致します。
- ベストアンサー
- PHP
- エクセルのマクロでループ処理
エクセルのマクロで、ループを使っています 下の様な感じです。 sub TEST() a: re=re+1 if ○○=○▲ THEN GOTO b: 処理・・・ goto a: b: end sub() ですが、これの書き方はDo WhileやDo Untilを使った方が 早く処理できるのでしょうか? また、書き方等もお教え下されば助かります。
- ベストアンサー
- オフィス系ソフト
- fortran 繰り返しループから抜きたい
10 continue : : : do 100 i=1,10 if (abs(x (i)-y(i)) .lt. 1.0) then r= r + dr goto 100 else goto 1000 end if 100 continue : : : 1000 contiue end すべての条件(i=1~10)が満足されたら、ループから抜きたいのですが、出来ませんでした。 教えて頂けませんでしょうか?よろしくお願しますね!*<>*!
- 締切済み
- 数学・算数
補足
すいません。説明が足りなかったでしょうか。 ループ処理で、 ある条件のときだけ処理をするときです。 ^^^^^^^^^^ elseの処理がないときです。 他にも、 while(ループ条件){ if (判定条件==true) { 処理 } } という書き方があると思います。