Ch4. 繰り返し文
while文とdo-while文
do-while も while-doも(if文と同じく)一行だけなら{}は不要
int count = 10; do System.out.println("Number is : " + count--); while(count > 0); while(count < 10) System.out.println("Number is : " + count++);
while文で{}を使わなかった場合、2行目以降は無視される(ループに入らない)だけだが、do-while文を{}を使わずに書いた場合、2行以上の処理がループに存在するとエラーになる。
条件分岐の中身は(if文と同じく)式の戻り値がbooleanならOK
boolean a = false; boolean b; do System.out.println("Number is : " + ++count); while(b = a);//最後の;も必要
for文
for文では式1,式2,式3をそれぞれ省略することが出来る。
式2を省略した場合、常にTrueとしてループが回り続ける
int count2 = 1; for(; count2 < 5; count2++){ System.out.println("loop"); } int count3 = 0; for(; count3 < 5;){ System.out.println("loop" + count3++); } int count4 = 0; for(;;){ System.out.println("In the loop");//1回だけの表示 break;//次の条件分を見に行かない。 } //for(){} //これは;が入ってないのでダメ
式1・式3の中身は『中身が式なら』2つコンマで区切って設定することもできる。
式2は当然2つ以上設定することが出来ない。式2を2つ以上利用したい場合は、&&
等で条件式を繋げればよい。
//式1には"式"であれば2つの式を入れることが可能 int i2 = 0; int i3 = 0; for(i2++, i3++; count4<10; count4++){ System.out.println("I2 is :" + i2 + " I3 is : " + i3) ; //式1は一回しか評価されない。表示は'I2 is :1 I3 is : 1'×10回のみ } //for(i2; count4<10; count4++){} //式1が変数のみになっているのでコンパイルエラー int countC = 0; for(int countA = 0; countA < 10 && countC < 10; countA++){ System.out.println("CountC :" + countC++); }
式1では、複数の変数を定義することが出来るが、全ての変数が同じ型でなくてはいけない。 実際には、2つ目以降の変数には型指定をすることができない。(つまり全て同じ型の変数と判断される。)
for(int countA = 0, countB = 0, countC = 0, countD = 0; countA < 10 && countB < 10; countA++){ System.out.println(countC + "" + countD); } //ただし、型はintに限らない for(float countA1 = 0, countB2 = 0, countC2 = 0, countD2= 0; countA1 < 10 && countB2 < 10; countA1++){ System.out.println(countC2 + "" + countD2); }
式1の型指定はint型でなくとも、floatやbyteでも構わない。
式3は各ループごとの更新処理を2つ設定することが出来る。
便利そう。
//式3の更新処理も2つ設定できる。 int countD = 0; for(int countE = 0; countD < 10 && countE < 10; countE++, countD++) System.out.println("CountD is : " + countD + "CountE is : " + countE); // 'CountD is : 0CountE is : 0' // 'CountD is : 1CountE is : 1' // ... // 'CountD is : 9CountE is : 9'
break, continue, label
break
//breakでは(例えIf文内でbreakが発生したとしても)ループ自体を抜けだすことが出来る。 for(int i = 0; ;){ if(i == 0){ System.out.println("break inside if statement"); break; } }
countinue
for(int i = 0; i < 7; i++){ System.out.println("numbe is : " + i); if(i % 3 == 0) continue; System.out.println("3の倍数ではない"); //'numbe is : 0 //'numbe is : 1' //3の倍数ではない' //'numbe is : 2' //3の倍数ではない' //'numbe is : 3' //'numbe is : 4' }
label
ラベルは、抜け出したいループを指定する際に利用する。
loop1: for(int x = 0; x < 3; x++){ loop2: for(int x2 = 0; x2 < 3; x2++){ System.out.println("break"); break loop1; } }
labelはcontinue
とbreak
とでセットで使われるためループぐらいでしか使い道は無いように思われる。
しかし、言語仕様としてはコードブロック・return・try-throw等でも利用できる。
labelを利用してswitch文の代わりのようなものを書くこともできる。
//例えば下記のようにSwitch文の代わりに使うこともできる。 alterateSwitch:{ if(a < 10){ System.out.println("a is less than 10."); break alterateSwitch; } if(a <= 10){ System.out.println("a is 10"); break alterateSwitch; } if(a < 11){ System.out.println("a is lager than 10"); break alterateSwitch; } }
なおlabelは変数宣言には付けることが出来ない。(初期化処理には付けることが出来る。)
int a; //変数宣言にはlabelは付けられない。 labelA: a = 10;