こんにちは、現役SEの「とも」です。
今回は、繰り返し処理のfor文について説明します。
繰り返し処理は、記載した条件が成立するまでfor文の{}内の処理を繰り返し実行します。
繰り返し処理には他にforearchやwhileなど、いくつか記述方法がありますので、それぞれの特徴を覚えておきましょう。
forの構文
for (初期化式; 条件式; 変化式) {
// 繰り返す処理
}
項目 | 説明 |
---|---|
初期化式 | for文の処理を実行する前に1度だけ実行する式を記載します。 |
条件式 | for文の処理を実行する条件式を記載します。 処理を実行する前に毎回チェックします。 |
変化式 | for文の処理が1回終わるたびに実行する式を記載します。 |
初期化式
初期化式は、変数の宣言も併せて行うことができます。
その場合は、初期化式で宣言した変数のスコープはfor文の処理内となります。
for (int i = 0; i < 10; i++) { // iのスコープ
//繰り返す処理 // iのスコープ
}
forの外でも使用する変数の場合は、初期化式ではなく、for文の前に宣言します。
int i;
for (i = 0; i < 10; i++) { // iのスコープ
//繰り返す処理 // iのスコープ
}
// forの後の処理 // iのスコープ
ちなみに、あまり使用することはありませんが複数の変数を初期化することも可能です。
String str;
int i, j;
for( i = 1, j = 1, str = "test"; i < 3; i++,j+=2) { // 「i = 1, j = 1, str = "test"」の部分
System.out.printf("i=%d,j=%d,str=%s\r\n", i,j,str);
}
【実行後のコンソール表示】
i=1,j=1,str=test
i=2,j=3,str=test
i=3,j=5,str=test
条件式
条件式では、結果がbooleanとなる演算であれば任意の式を使用することができます。
条件式がtrueの場合に、for文の繰り返し処理は実行されることになります。
下の例でいうと、「i < 10」の条件は、
- iが10未満なら繰り返し処理を実行する
ということですね。
for (int i = 0; i < 10; i++) {
//繰り返す処理 iが0~9の間、処理を実行する
}
ちなみに、通常はこのような複雑な条件式を使用することはありませんが最終的にboolean型の演算結果となれば、複雑な条件式を記述することも可能です。
for( int i = 1, j = 1; i < 3 && j <= 3; i++,j+=2) { // 「i < 3 && j <= 3」の部分
System.out.printf("i=%d,j=%d\r\n", i,j);
}
【実行後のコンソール表示】
i=1,j=1
i=2,j=3
変化式
変化式では、繰り返し処理後の動作を記述できます。
通常は、カウンター(変数「i」のこと)をインクリメントすることに使用します。
for (int i = 0; i < 10; i++) {
//繰り返す処理 iが0~9の間、処理を実行する
}
インクリメントについて「i++」と記述していますがこれは慣例的な記述で、「++i」と書いても動きに違いはありません。
変化式は繰り返し処理後に処理を行うため、この後に出てくる「break」を使用して繰り返し処理を途中で終了した場合、処理は実行されません。
ちなみに、通常は使用することはありませんが変化式でも複数の記述ができます。
for( int i = 1, j = 1; i < 3 && j <= 3; i++,j+=2) { // 「i++,j+=2」の部分
System.out.printf("i=%d,j=%d\r\n", i,j);
}
繰り返し処理をスキップするには「continue」を使う
繰り返し処理では、条件によっては処理をスキップしたい時があります。
そのような場合、「continue」を使うことでその回のループをスキップすることができます。
- continueの場合、変化式「i++」は実行されて「i」がひとつカウントアップします。
for (int i = 1; i <= 3; i++) {
if(i == 1){
continue; // 初回はスキップ(iが1の時は繰り返し処理はスキップする)
}
//繰り返し処理 iが1の時は処理されない
System.out.printf("i=%d\r\n", i);
}
【実行後のコンソール表示】
i=2
i=3
繰り返し処理を終了するには「break」を使う
条件式が不成立となる前に繰り返し処理を終了したい場合は、「break」を使います。
breakを使い、繰り返し処理を強制的に終了した場合は、変化式「i++」は実行されません。
int i;
for (i = 1; i <= 5; i++) {
System.out.printf("繰り返し処理前 i=%d\r\n", i);
if(i == 3){
break; // iが3の時に繰り返し処理を終了する
}
//繰り返し処理 iが3以降は処理されない
System.out.printf("繰り返し処理 i=%d\r\n", i);
}
System.out.printf("for文から抜けた後 i=%d\r\n", i);
【実行後のコンソール表示】
繰り返し処理前 i=1
繰り返し処理 i=1
繰り返し処理前 i=2
繰り返し処理 i=2
繰り返し処理前 i=3
for文から抜けた後 i=3 ← breakした時のカウントのまま
for(;;) 省略の記述
for文の「初期化式」「 条件式」「 変化式」は、省略して以下のように記述することができます。
- 条件式を省略した場合、繰り返し処理内に「break」を記述しないと無限ループになるので注意しましょう。
通常このような書き方はしませんが、書いてあるソースコードがあった時のために、動きを覚えておくと良いです。
【初期化式を省略】
int i = 1; // 初期化部分を外だし
for (; i <= 3; i++) {
//繰り返し処理
System.out.printf("繰り返し処理 i=%d\r\n", i);
}
【条件式を省略】
for ( int i = 1;; i++) {
if(i == 4){ // 終了条件でループを終了させる
break;
}
//繰り返し処理 iが1~3の間の処理
System.out.printf("繰り返し処理 i=%d\r\n", i);
}
【変化式を省略】
for ( int i = 1; i <= 3; ) {
//繰り返し処理
System.out.printf("繰り返し処理 i=%d\r\n", i);
++i; // 処理の最後でインクリメント
}
全て省略して以下のように完全なループとして記述することもできます。
【全て省略】
int i = 1; // 初期化部分を外だし
for (;;) {
if(i == 4){ // 終了条件でループを終了させる
break;
}
//繰り返し処理 iが1~3の間の処理
System.out.printf("繰り返し処理 i=%d\r\n", i);
++i; // 処理の最後でインクリメント
}