LoginSignup
0
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-09-08

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でも複雑なルールがなくてよかった

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3