Javaのforループの詳しい説明


 
 
for ステートメントは、最も広く使用されている強力なループ ステートメントです。ほとんどの場合、for ループは while ループと do while ループの代わりに使用できます。

 

for ステートメントは、プログラムを実行する前に条件式が true であるかどうかを最初に判断する必要があるループ ステートメントです。条件式の結果が false の場合、そのループ ステートメントはまったく実行されません。 for ステートメントは通常、反復回数がわかっているループ内で使用されます。

for ステートメントの構文形式は次のとおりです。

 for(条件式1;条件式2;条件式3) {
    ステートメントブロック;
} 

for ループ内の 3 つの条件式の意味を表 1 に示します。

表 1 for ループ内の 3 つの式の意味
表現 形状 関数
条件式1 代入文 ループ構造の最初の部分。ループ変数に初期値を代入します。 int i=1
条件式2 条件文 ループ構造のループ条件 i>40
条件式3 反復ステートメント、通常は使用
++ または — 演算子
ループ構造の反復部分。通常はループ変数の値を変更するために使用されます。 i++

for キーワードの後の括弧内の 3 つの条件式は「;」で区切る必要があります。 for ループ内のこれら 3 つの部分と中括弧内の 4 つのコンポーネントは、ループ本体をわかりやすくシンプルにまとめます。

for ループ文の実行手順は、まず条件式 1 を実行して初期化し、条件式 2 の値が真かどうかを判定し、真の場合はループ本体の文ブロックを実行し、そうでない場合は直接ループを終了します。最後に式 3 を実行してループ変数の値を変更し、ループを終了します。次に、条件式 2 の値が false になるまで次のサイクルが実行され、サイクルが終了します

for ループのループ反復ステートメントはループ本体と一緒に組み込まれていないため、ループ本体を実行してループを終了するときに continue ステートメントに遭遇した場合でも、ループ反復ステートメントは引き続き実行されることに注意してください。

for ループは while および do while ループとは異なります。while および do while ループのループ反復ステートメントはループ本体に続くため、ループ本体が完全に実行できない場合、または continue ステートメントを使用してループを終了する場合、ループ反復ステートメントは実行されません。ただし、for ループのループ反復ステートメントはループ本体にまとめられていないため、ループの終了に continue ステートメントが使用されるかどうかに関係なく、ループ反復ステートメントは実行されます。

前のループと同様に、ループ本体にステートメントが 1 行しかない場合は、ループ本体の中括弧を省略できます。

たとえば、5 の階乗を計算する場合、for ループを使用する実装コードは次のようになります。

 public static void main(String[] args) {
    int result = 1;
    for (int number = 1; number <= 5; number++) {
        result *= number;
    }
    System.out.print("5 の階乗の結果は: " + result);   // 出力"5の階乗の結果は: 120"
} 

上記のステートメントの意味は、1 から開始して、数値変数の値が 5 より大きくなるまで毎回 1 ずつ増加してループを終了すると理解できます。ループ中に、number の値が result の現在の値で乗算されます。

for ステートメントの初期化、ループ条件、反復部分はすべて空のステートメントにすることができます (ただし、セミコロンは省略できません)。3 つすべてが空の場合、無限ループと同等になります。これらの状況を以下に順番に紹介します。

1.条件式1が空です

for 文中の条件式 1 の効果はプログラム内の他の場所に与えることができるため、条件式 1 が空の場合、for 文以降の括弧内の他の条件式の実行順序は変わりません。

たとえば、1 から 100 までのすべての奇数の合計を計算するには、この形式の for ステートメントを使用します。

 public static void main(String[] args) {
    int result = 0;
    int number = 1; // for文の1番目の式と同じ意味
    for (; number < 101; number++) {
        if (number % 2 != 0) // 2で割り切れない場合、奇数であると判断し、加算する
            result += number;
    }
    System.out.print("100以下の奇数の合計:" + result);
} 

実行後の出力は次のようになります。

 100以下の奇数の合計:2500 

2.条件式2が空です

for文の条件式2が空の場合、ループの終了条件はありません。このとき、for文は条件式2の値が常に真であるとみなし、無制限にループが実行されます。したがって、ある条件に達したときにループを抜け出すには、文ブロック内で論理判断をしてbreak文を使ってループから抜け出す必要があります。 そうしないと無限ループが発生します。

1 から 100 までのすべての奇数の合計を計算することも同様です。この方法を使用したコードは次のとおりです。

 public static void main(String[] args) {
    int result = 0;
    for (int number = 1;; number++) {
        if (number > 100)
            break; // equivalent to expression2 of the for statement, exiting the for loop when satisfied
        if (number % 2 != 0) // If the number cannot be divided by 2, it is odd, so add it up
            result += number;
    }
    System.out.print(result);
} 

3.条件式3が空です

for言語の条件式3が空の場合、制御変数を設定する式がない、つまり各ループ後に変数の値を変更することができず、現時点ではループの正常終了は保証できません。 。

1 から 100 までのすべての奇数の合計を計算することも同様です。この方法を使用したコードは次のとおりです。

 public static void main(String[] args) {
    int result = 0;
    for (int number = 1; number < 101;) {
        if (number % 2 != 0) // もし2で割れない時、つまり奇数の場合、加算する
            result += number;
        number++; // for文の条件式3に相当し、1ずつ増やす
    }
    System.out.print("100以下の奇数の合計は:" + result);
} 

ループ本体ステートメントがない場合、number 変数の値は 1 となり、常に 101 より小さいため、ループを終了できず、無限ループが形成されます。上記のコードでは、for ループの本体にnumber の increment ステートメントを入れます。その効果は完全な for ステートメントと同じです。

4. 3 つの条件式がすべて空です

for ループ ステートメントでは、条件式のどの部分が欠落していても、プログラム内の他の場所で補うことができるため、for ループ ステートメントの整合性が維持され、ループが正常に実行されます。

for文内のループ本体がすべて空、つまりループ初期値がない場合、ループ条件の判定は行われず、ループ変数の値は増加しませんが、このときループ本体は無条件で実行されます。無限ループまたは無限ループを形成します。この場合、読者はそれを使用するときは避けるようにしてください。

たとえば、1 から 100 までのすべての奇数の合計を計算する場合、このメソッドを使用するコードは次のようになります。

 public static void main(String[] args) {
    int result = 0; // 結果を示す変数
    int number = 1; // forループの式1に相当する
    for (;;) {
        if (number > 100)
            break; // forループの式2に相当する
        if (number % 2 != 0) // 2で割り切れない場合、奇数を表すので、結果に加算する
            result += number;
        number++; // forループの式3に相当する
    }
    System.out.print("100以下のすべての奇数の合計は:" + result);
} 

例1

スーパーマーケットの上半期の総売上高をカウントするJavaプログラムを作成します。ユーザーは月ごとの売上高を入力する必要があります。 forループを使用した実装コードは以下のとおりです。

 public static void main(String[] args) {
    int sum = 0;
    int num = 0;
    Scanner sc = new Scanner(System.in);
    for (int i = 1; i <= 6; i++) {
        System.out.println("第" + i + "ヶ月の販売数量を入力してください:");
        num = sc.nextInt();
        sum += num;
    }
    System.out.println("上半期の販売量は:" + sum);
} 

このプログラムではループ回数を制御するループ変数 i を宣言し、1 に初期化しています。ループが実行されるたびに、i の値が 6 以下であるかどうかを判断する必要があります。条件が true の場合はスコアを蓄積し続け、そうでない場合はループを終了します。

ループ本体が実行されるたびに、i に 1 が加算されます。 i の値が 6 より大きくなるまでこのサイクルを繰り返し、サイクルを停止します。この時点で for ループ本体を終了し、一番下のステートメントを実行して累計売上高を出力します。

for、do-while、while の違い

「 Java while および do while ループ」では do-while ループと while ループについて学び、このセクションでは for ループについて学びました。 do-while と while の具体的な類似点と相違点については、先ほどのチュートリアルで紹介されているので、ここではあまり説明しません。以下では、表 2 に示すように、主に相違点を紹介します。

表 2 for、do-while、while の違い
名前 コンセプト 該当シーン 特徴
for ループ回数制限に基づいて何回繰り返すか ループ数がわかっている操作に適しています
  • 初期化条件はローカル変数と外部変数を使用できます
  • ローカル変数を使用すると、for終了後にコントロールの実行が自動的に解放されるため、メモリ使用効率が向上します。
  • そして、for ループが終了した後は変数にアクセスできなくなります。
  • 最初に判断し、後で実行する
while 特定の条件が満たされたときに何かを行う ループ回数が不明な操作に適しています
  • 初期化条件では外部変数のみを使用でき、変数には while ループ終了後にアクセスできます。
  • 最初に判断し、後で実行する
do-while 条件が満たされているかどうかを判断する前に、最初に 1 回実行します 少なくとも 1 回実行されるループ操作に適しています
  • 最初に 1 回実行する必要がある場合、コードはより簡潔になります。
  • 一度実行し、後で判断する

例 2

for、do-while、while を使用して、それぞれ 1 ~ 10 の合計を求めます。

1) for ループを使用する

コードは以下のように表示されます:

 public static void main(String[] args) {
    int sum = 0;
    for (int i = 1; i < 11; i++) {
        sum = sum + i;
    }
    System.out.println(sum);
} 

実行結果は55です。

2) do-while ループを使用する

コードは以下のように表示されます:

 public static void main(String[] args) {
    int sum = 0;
    int i = 1;
    do {
        sum = sum + i;
        i++;
    } while (i < 11);
    System.out.println(sum);
} 

実行結果は55です。

3) while ループを使用する

コードは以下のように表示されます:

 public static void main(String[] args) {
    int sum = 0;
    int i = 1;
    while (i < 11) {
        sum = sum + i;
        i++;
    }
    System.out.println(sum);
} 

実行結果は55です。

上記のコードから、ループの数がわかっているため、for ステートメントが明らかにより簡潔であることがわかります。

 

「 Javaのforループの詳しい説明」についてわかりやすく解説!絶対に観るべきベスト2動画

【Java超入門コース】11.繰り返し|同じ処理を何度も実行できます【プログラミング初心者向け入門講座】