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はcontinuebreakとでセットで使われるためループぐらいでしか使い道は無いように思われる。 しかし、言語仕様としてはコードブロック・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;