for
文last-modified: Dec./26th/2001
前節では while
ループについて説明しました。本節では、やはり繰り返し制御構文である for
ループについて説明します。
for (初期条件; 繰り返し条件; 継続処理) { ブロック }
if 文のところで、"{
" から "}
" までをブロックと呼ぶことは紹介しました。 for ループは、繰り返し条件が真である限り、ブロック内を繰り返し実行し続けます。
初期状態、繰り返し条件、継続処理は全て省略可能です。その場合、セミコロンだけ記述します: for(;;){...}
実行可能な具体例で見てみましょう。
ForDemo.java
:
class ForDemo {
public static void main(String[] args) {
for (int i = 0; i <= 2; i++) {
System.out.println("カウンタ:" + i);
}
}
}
これは、整数型変数 i
を0で初期化して、ブロック内部が実行されるたびに i
の値を一つ増やします。増やした後で、再びブロック内部を実行するかどうかを判定するために、条件文 i <= 2
を評価します。これが true
(真)を返せばブロック内部を実行します。
噛み砕くと、次のようになります。
i = 0
なので i <= 2
は真を返すのでブロック内部が実行され、最後に1加えられて i = 1
になります。i = 1
なので条件文が真となりブロック内部が実行され、最後に1加えられて i = 2
になります。i <= 2
は真なのでブロックが実行されます。以上、都合3回ブロック内部を繰り返します。3回実行した最後に i = 3
になるので、条件文が false
(偽)となり、ブロック内部は実行されません。
上のサンプル ForDemo.java
の実行例は次のようになります:
C:\>cd java C:\java>javac ForDemo.java C:\java>java ForDemo カウンタ:0 カウンタ:1 カウンタ:2 C:\java>
そろそろ Java アプリケーションのコマンドラインからの実行に慣れてもらいたいと思います。
この for
文を while
文で書き換えると次のようになります:
int i = 0; while (i <= 2) { System.out.println("カウンタ:" + i); i++; }
ここで、変数の話をしましょう。変数は、宣言したブロック内でしか有効ではありません。従って、 for(int i=0; i<=10; i++){...}
とすると、変数 i
は、この for
ブロック内でしか有効ではありません。次の例は誤りです:
//間違っている例 for (int i=0; i<=10; i++) { System.out.print(i + " "); } //ブロックの外部で i は定義されていない // 未定義の変数 i を使っているのでエラー System.out.print("counter: " + i);
次のように修正すべきです:
int i = 0; for (; i <= 10; i++) { System.out.print(i + " "); } System.out.print("counter: " + i);
このとき、実行結果は次のようになります:
C:\Java>java TestFor 0 1 2 3 4 5 6 7 8 9 10 counter=11
繰り返し、条件分岐はプログラム開発では必ず使います。本格的に開発を始める前に、十分なれておくと良いでしょう。
実際に開発を始めると、繰り返しブロックから、途中で脱出したいことがあります。そのときは continue;
或いは break;
を使います。次に、そのことについて説明します。
ここでは簡単なサンプルだけ挙げておきます:
class TestFor { public static void main(String[] args) { for (int i=0;i<=10; i++) { System.out.print(i + ": "); } } }
初期条件では、カウンター変数の型宣言と初期化を同時にしています。
C:\Java>javac TestFor.java C:\Java>java TestFor 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
次のサンプルは、イタレーションによって円周率を計算するものです。
class CalPi { public static void main(String[] args) { if (args.length != 1) { System.out.println("イタレーションの回数を入力してください。"); return; } //変数定義 int steps = Integer.parseInt(args[0]); double calpi=0, pi=0; int pm=-1; //円周率計算の公式 for (int i=0; i < steps; i++) { pm *= -1; calpi += pm/(2.0*i + 1.0); pi = calpi*4; System.out.println(i + ": " + pi); } System.out.println("----------------------"); //計算結果の円周率 System.out.println("計算結果:" + pi); //Math クラスで定義される円周率 System.out.println(" 円周率:" + Math.PI); } }
C:Java>javac CalPi.java C:\Java>java CalPi 5000 0: 4.0 1: 2.666666666666667 2: 3.466666666666667 3: 2.8952380952380956 4: 3.3396825396825403 5: 2.9760461760461765 省略 4995: 3.141392493463693 4996: 3.1417927736598306 4997: 3.1413925735597807 4998: 3.1417926935957916 4999: 3.141392653591791 ---------------------- 計算結果:3.141392653591791 円周率:3.141592653589793
5000 回、繰り返しても有効数字 3 桁ですから、この公式の収束速度は非常に低いことが分かります。因みに、50000 回の繰り返しで 3.1415726535897814 で、有効数字 5 桁です。