##今回の内容
前回は,プログラミングの最重要要素の1つであるif文についてでした.
今回は,もう1つの最重要要素であるfor文について,学習していきます.
##for文とは
プログラムを書いていると,ある処理を繰り返し行いたい場面に遭遇することがあります.
例えば,1から7までの数字に3ずつかけて,その結果がほしい!(そんな場面ないか)とか…
1から7くらいなら地道に書いても書ききれそうですが,1から100,000,000,000まで,なんて言われたら,とても自力で書ける気がしません.
そんなときに,「3ずつかける」という動作を繰り返す(ループする),という命令が書けるのがfor文です.
for文はif文と同じブロック構造なので,if文と組み合わせることができ,とてつもない力を発揮できます.
##構文
if文に少し似ていますが,for文のほうがちょっとだけ複雑です.
for文は次のような構文で書きます.
for (カウンタ初期値; ループ条件; カウンタ操作) {
繰り返したい動作
}
カウンタというのは,for文を用いて繰り返す際,繰り返す回数として利用するものです.
先程の例で言うと,1から7まで繰り返す場合は,1がカウンタ初期値となります.
次に,ループ条件は,繰り返しをする条件です.条件なので,真偽値でなければいけません.
最後のカウンタ操作とは,繰り返したい動作をすべて行った後,カウンタに対して行う操作です.
例で言えば,カウンタを+1(インクリメント)してから繰り返すことで,1,2,3,…と繰り返すことができ,ループ条件を「カウンタが7以下」という条件にすればいいわけです.
こんな感じ.
for (int i = 1; i <= 7; i++) {
System.out.println(i * 3);
}
##for文の基本
カウンタ初期値の部分で,変数の宣言を同時に行うことができます.
が,事前に宣言してある変数を使うこともできます.
int i = 0;
for (i = 1; i <= 7; i++) {
System.out.println(i * 3);
}
僕はメモリ節約のためにカウンタを使いまわしたりしますけど,使いまわすと可読性が落ちるので,他人に見られるコードでは使い回しはやめたほうがいいかもしれません.
また,for文の括弧内の要素は省略することができます.
int i = 0;
for (;;) {
System.out.println(i * 3);
}
このプログラムだと全く意味無いですが…
ここで注意するのは,ループ条件が空だと無限ループするという点です.
ForExample3.javaでは,無限に0が出力されます…
プログラムの無限ループは,それ以上プログラムが進むことができなくなるため,絶対に起こしてはいけません.
プログラムによっては,マシンに負荷をかけすぎて,壊してしまうことも…
このような事故を起こさないため,ループ条件には注意しましょう.
じゃあ省略できないようにすればいいじゃん…って僕は思うんですがね.
##break文
さて,for文のループ条件を空にした場合,無限ループになってしまうという問題がありますが,無理矢理ループを抜け出す,という命令が用意されています.
for文のようなループ処理を行うブロックの中に(for文以外にもループ処理ができる構文が存在するのです),「break;」と書くと,その行までプログラムが進むと,強制的にループを抜けることができます.
int i = 0;
for (;;) {
System.out.println(i * 3);
break;
}
このようにすると,0が1回出力されてbreakによってループを抜け出します.
if文と組み合わせて利用することで,真価を発揮します.
int i = 0;
for (;;i++) {
System.out.println(i * 3);
if (i >= 10000) {
break;
}
}
これで,iが10000以上になると,強制的にループを抜けられるようになりました.
breakはfor文よりもwhile文というループ構文で使うことが多いと思います.
ただ,breakを多用するプログラムは美しくないと言われます…
##ネスト構造
さて,最初にお話したとおり,for文はif文と同じブロック構造なので,ネスト構造にすることができます.
for (int i = 0; i <= 100; i++) {
for (int j = 0; ; j++) {
System.out.println(i * j);
if (j >= 20){
break;
}
}
}
ネスト構造内でbreakを使うときは,抜けられるループは1段階だけという点に注意です.
この場合,breakで抜けるのはjを使っているfor文のみであり,iを使っているfor文を抜け出すことができません.
##おわり
前回のif文と今回のfor文を組み合わせることで,できることの幅が広がると思います.
次回は,さらにできることが増えるようなものについてお話します.
ついでに今回説明できなかった拡張for文についても説明できるといいかな…?