3.6 for文
3.6.1 カウンタ付き繰り返し制御
繰り返し制御は while 文さえあれば実現できるものですが、実際にはカウンタ変数を用意したり、繰り返すたびにカウンタを加減算しなければならないなど、面倒な手続きが必要です。そこで、多くのプログラマはカウンタの制御も同時に行ってくれる for 文を愛用する傾向があります。for 文の考え方も while 文同様で、条件が満たされている間、指定した文を繰り返し実行します。
for(初期化式 ; 条件式 ; 更新式) 文
初期化式は、for 文が実行されるとき、最初に実行される文です。この場では、ローカル変数宣言文、または式文を記述することができます。通常、ここで繰り返しの回数などを保存するためのカウンタ変数を宣言します。そうすることで、for 文の内部だけで使うことができる一時的な変数を作ることができるのです。
条件式は while 文と同様に、再び文を繰り返すかどうかを判断するための boolean 型の値を指定します。true であれば文を実行し、false であれば制御を抜け出します。初期化式と条件式をそれぞれ評価した後、文を実行します。
文の実行が終了すると、次に更新式が実行されます。更新式では、初期化式などで宣言されたカウンタ変数のインクリメント処理など、繰り返し毎に行うべき計算などを記述します。
このとき、初期化式と更新式はセミコロン ; で終わらないことを意識しなければなりません。通常、式文はセミコロンで終わると定められていますが、for 文でのセミコロンは初期化式、条件式、更新式の記述を区切るための記号として、構文的に定められています。
class Test { public static void main(String args[]) { for(int i = 0 ; i < 10 ; i++) System.out.println(i); } }
>java Test 0 1 2 3 4 5 6 7 8 9
コード1はシンプルなプログラムですが、for 文の機能を使ってカウンタ変数の値を繰り返す度に表示しています。カウンタ変数 i は for 文の初期化式で宣言され、これが 10 より小さければ文が繰り返されます。文を実行すると、その後、必ず更新式が実行されるため i の値は繰り返すごとにインクリメントされていきます。
ローカル変数宣言文を指定することができるのは初期化式だけであり、更新式では式文以外を指定することはできないことに注意してください。また、初期化式は、ローカル変数宣言文か式文のいずれかのみを指定することが可能なのであって、変数の宣言と式文を同時に指定することはできません。
初期化式と更新式では、変数を宣言したり、値を更新したりしていますが、セミコロンを使うことができないため、複数の文を指定することができません。しかし、より複雑なアルゴリズムを式文として記述したい場合、1 つの式文では記述できないことがあります。
実は、for 文の初期化式と更新式は特別で、式文並びを指定することができます。式文並びとは、式文をカンマ , で区切り、複数の式を指定した式文の並びです。これを使えば、初期化式や更新式に複数の式文を指定することができるようになります。例えば、次の式は式文並びです。
i++ , j++ , k = i * j
式文並びは、必ず左から右に向かって評価されます。この場合 i++、j++、k = i * j の順番で計算されるでしょう。
また、for 文の初期化式、条件式、更新式は省略することができます。初期化式と更新式が省略されている場合は while 文と同様に働きます。for 文の開始時や、更新式の評価のタイミングになると、何もせずに次の処理に移行します。条件式が省略された場合は常に true であると判断されます。この場合は無限ループに陥るため break 文などで強制終了させる必要があります。break 文については「3.8 break文とcontinue文」で解説します。
ただし、初期化式、条件式、更新式のすべてを省略する場合でも、それらを区切るセミコロン ; を省略することはできません。つまり、すべてを省略した場合でも for ( ; ; ) という形になります。
class Test { public static void main(String args[]) { int i = 0; String temp = "繰り返し回数 = " , str = temp + i; for( ; i < 10 ; i++ , str = temp + i) System.out.println(str); } }
>java Test 繰り返し回数 = 0 繰り返し回数 = 1 繰り返し回数 = 2 繰り返し回数 = 3 繰り返し回数 = 4 繰り返し回数 = 5 繰り返し回数 = 6 繰り返し回数 = 7 繰り返し回数 = 8 繰り返し回数 = 9
コード2では、カウンタ変数 i と文字列が他の変数 temp 及び str を宣言しています。これを使って、for 文の更新式ではカウンタ変数 i をインクリメントすると同時に、"繰り返し回数 = i" という文字列を作成して str 変数に代入しています。繰り返し処理では、この str を常に表示するように仕組んでいます。カウンタ変数はすでに宣言されているため、for 文の初期化式は省略しています。
Java において for 文で使われる式文並びは for 文専用の構文として扱われています。C/C++ 言語では、構文ではなく順次評価演算子 , が定義されているため、for 独自の構文ではなく、式文並びを演算子の働きとして記述することができました。C/C++ プログラマは、この違いを認識する必要があります。