Java Silver 4章 繰り返し文と繰り返し制御文


while文

while(条件式){
処理文(条件式がTrueであり続ける間繰り返される)
}
{}を省略する場合、処理文は下1行のみ

public static void main(String[] args) {
  int num = 0;
  while(num > 0){    
    System.out.print(num + " "); //なにも出力されない
    num--;  
  }
}

do-while文

do{
処理文;
}while(条件式);
{}を省略する場合、処理文は下1行のみ

public static void main(String[] args) {
    // while の場合
    int count = 5;
    while(count != 5 && count > 0){
      System.out.println("while    : count = " + count);
      count--;
    }
    // do-while の場合
    count = 5;
    do{
      System.out.println("do-while : count = " + count);
      count--;
    }while(count != 5 && count > 0);
  }

whileの場合、条件式によっては一度も処理文が実行されない
while と do-whileの違いは処理文と判定式の順序

for文

for(式1; 式2; 式3;){
 処理文;

式1~3のそれぞれは省略可能
ただし式2を省略すると、条件が常にTrueとなり無限ループ

public static void main(String[] args) {
  int count1 = 0;
  for(; count1 < 5 ; count1++){  // 式1を省略した例
   System.out.print(count1 + " ");  
  }
  System.out.println();  //改行
  for(int count2 = 0 ; count2 < 5 ; ){ // 式3を省略した例
    System.out.print(count2++ + " "); // 処理文内でカウンタ変数の更新
  }
}

for文・条件式のルール

for(初期化文; 条件文; 更新文){}

初期化文
・カンマ区切りの宣言でない2つまでの文
・宣言式は1つ

条件文
・複数の式を記載できない

更新文
・処理が終わった後に実行される
・カンマ区切りの宣言でない2つまでの文
・メソッドの呼び出しも可能

拡張for文

配列の全要素を順番に取り出して処理ができる

for(変数宣言: 参照変数名){
 処理文;
}

public static void main(String[] args) {
  // 配列の宣言
  char[] array = { 'a', 'b', 'c', 'd', 'e' };
  // 配列arrayの全要素を順番に取り出し、出力する
  for(char c : array){  // 拡張for文で処理する場合
    System.out.print(c + " ");
  }
  System.out.println(); //改行
  // for文で処理する場合
  for(int count = 0; count < array.length ; count++){
    System.out.print(array[count] + " ");
  }
}

制御文のネスト

ネスト(入れ子):制御文の内部に制御文を設置することも可能

//外部のfor文にて0からループの度に+1づつ増える変数iに対し
//内部のif文にて4で割った余りが0の場合のみprintlnで出力している
public static void main(String[] args) {
  // 外側の制御文 for
  for(int i = 1; i < 10 ; i++){
    // 内側の制御文 if
    if((i % 4) == 0){ 
      System.out.println(i + " は 4 の倍数です。");
    }
  }
}

繰り返し制御文

繰り返し文の中で判定条件がtrueでも特定の条件下で繰り返し処理から抜けい場合
・break文
・continue文
を使用する

break文

public static void main(String[] args) {
  for(int i = 0; ; i++){ //式2が省略されているので無限ループ
    if(i == 3){
      break;    // breakによりfor文から抜ける
    }
    System.out.println("i = " + i);
  }
  System.out.println("for文の後の処理");
}

breakのポイントをif文の条件式で判定している

cntinue文

public static void main(String[] args) {
  for(int i = 1; i < 10 ; i++){
   if((i % 3) == 0){
     System.out.println("処理をスキップします");
     continue;    // continueによりfor文の式3へ制御を移す
   }
   System.out.println("i = " + i);
  }
 System.out.println("for文の後の処理");
}

continue文は残りの処理をスキップし、次のループを続ける。

breakはループの全行程を抜け
continueはその1度だけ処理ループを抜ける

ラベル

ネスト構造の繰り返し文から抜けたいときに使用

public static void main(String[] args) {
  loop1:     // ラベルloop1を指定
  for(int x = 0; x < 3 ; x++){
    for(int y = 0; y < 3; y++){
      System.out.println("x = " + x + " y = " + y);
      if(x == 1 && y ==1){
        System.out.println("break文の実行");
        break loop1;  // ラベルloop1にbreak
      }
    }
  }
  System.out.println("------------------------------");
  loop2:     // ラベルloop2を指定
  for(int x = 0; x < 3 ; x++){
    for(int y = 0; y < 3; y++){
      System.out.println("x = " + x + " y = " + y);
      if(x == 1 && y ==1){
        System.out.println("continue文の実行");
        continue loop2;  // ラベルloop2にcontinue
      }
    }
  }
}
x = 0 y = 0
x = 0 y = 1
x = 0 y = 2
x = 1 y = 0
x = 1 y = 1
break文の実行
------------------------------  //breakで全てのループから抜けfor文に戻ることはない
x = 0 y = 0
x = 0 y = 1
x = 0 y = 2
x = 1 y = 0
x = 1 y = 1
continue文の実行 
//continuで全てのループから抜けた後、再び外側のfor文の判定式へ
//x,yの値も継続しており、結果的にcontinue以下の内側ループをスキップした形
x = 2 y = 0
x = 2 y = 1
x = 2 y = 2

第4章の感想

なじみのある構文はjavaでも複雑なルールがなくてよかった