LoginSignup
0
1

More than 5 years have passed since last update.

java学び直しメモ part4 ~for文~

Posted at

今回の内容

前回は,プログラミングの最重要要素の1つであるif文についてでした.

今回は,もう1つの最重要要素であるfor文について,学習していきます.

for文とは

プログラムを書いていると,ある処理を繰り返し行いたい場面に遭遇することがあります.
例えば,1から7までの数字に3ずつかけて,その結果がほしい!(そんな場面ないか)とか…
1から7くらいなら地道に書いても書ききれそうですが,1から100,000,000,000まで,なんて言われたら,とても自力で書ける気がしません.
そんなときに,「3ずつかける」という動作を繰り返す(ループする),という命令が書けるのがfor文です.
for文はif文と同じブロック構造なので,if文と組み合わせることができ,とてつもない力を発揮できます.

構文

if文に少し似ていますが,for文のほうがちょっとだけ複雑です.
for文は次のような構文で書きます.

ForStatement.java
for (カウンタ初期値; ループ条件; カウンタ操作) {
    繰り返したい動作
}

カウンタというのは,for文を用いて繰り返す際,繰り返す回数として利用するものです.
先程の例で言うと,1から7まで繰り返す場合は,1がカウンタ初期値となります.
次に,ループ条件は,繰り返しをする条件です.条件なので,真偽値でなければいけません.
最後のカウンタ操作とは,繰り返したい動作をすべて行った後,カウンタに対して行う操作です.
例で言えば,カウンタを+1(インクリメント)してから繰り返すことで,1,2,3,…と繰り返すことができ,ループ条件を「カウンタが7以下」という条件にすればいいわけです.
こんな感じ.

ForExample1.java
for (int i = 1; i <= 7; i++) {
    System.out.println(i * 3);
}

for文の基本

カウンタ初期値の部分で,変数の宣言を同時に行うことができます.
が,事前に宣言してある変数を使うこともできます.

ForExample2.java
int i = 0;
for (i = 1; i <= 7; i++) {
    System.out.println(i * 3);
}

僕はメモリ節約のためにカウンタを使いまわしたりしますけど,使いまわすと可読性が落ちるので,他人に見られるコードでは使い回しはやめたほうがいいかもしれません.
また,for文の括弧内の要素は省略することができます.

ForExample3.java
int i = 0;
for (;;) {
    System.out.println(i * 3);
}

このプログラムだと全く意味無いですが…
ここで注意するのは,ループ条件が空だと無限ループするという点です.
ForExample3.javaでは,無限に0が出力されます…
プログラムの無限ループは,それ以上プログラムが進むことができなくなるため,絶対に起こしてはいけません.
プログラムによっては,マシンに負荷をかけすぎて,壊してしまうことも…
このような事故を起こさないため,ループ条件には注意しましょう.
じゃあ省略できないようにすればいいじゃん…って僕は思うんですがね.

break文

さて,for文のループ条件を空にした場合,無限ループになってしまうという問題がありますが,無理矢理ループを抜け出す,という命令が用意されています.
for文のようなループ処理を行うブロックの中に(for文以外にもループ処理ができる構文が存在するのです),「break;」と書くと,その行までプログラムが進むと,強制的にループを抜けることができます.

ForExample4.java
int i = 0;
for (;;) {
    System.out.println(i * 3);
    break;
}

このようにすると,0が1回出力されてbreakによってループを抜け出します.
if文と組み合わせて利用することで,真価を発揮します.

ForExample5.java
int i = 0;
for (;;i++) {
    System.out.println(i * 3);
    if (i >= 10000) {
        break;
    }
}

これで,iが10000以上になると,強制的にループを抜けられるようになりました.
breakはfor文よりもwhile文というループ構文で使うことが多いと思います.
ただ,breakを多用するプログラムは美しくないと言われます…

ネスト構造

さて,最初にお話したとおり,for文はif文と同じブロック構造なので,ネスト構造にすることができます.

ForExample6.java
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文についても説明できるといいかな…?

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1