第8講・STEP 02

for文って何?

今回はfor文についてです。前にif文というのをやりましたが、あれは条件分岐の構文でしたね。for文というのは繰り返しの構文です。

繰り返しとは?

for文がどんなものか理解してもらう為に、2の累乗を計算するプログラムを作ってみます。例えば、2の5乗だと、数式にすると1×2×2×2×2×2で32になりますね。2の累乗とは1に2を何回掛けるかってことです。

この計算をプログラムにやってもらいましょう。int型変数answerを用意して、初めに1を代入してあります。そこに2を5回掛けます。

PowerOfTwo.java

public class PowerOfTwo {
    public static void main(String[] args) {
        int answer = 1;

        answer = answer * 2;   //1回
        answer = answer * 2;   //2回
        answer = answer * 2;   //3回
        answer = answer * 2;   //4回
        answer = answer * 2;   //5回

        System.out.print("2の5乗は、");
        System.out.println(answer);
    }
}

System.out.printは改行せずに出力し、System.out.printlnは出力した後に改行します。ここでは文字列とanswerの値が同じ行に表示されます。

全く同じ文「answer = answer * 2;」がいっぱい並んでいますが、意味分かりますでしょうか?

なんのこっちゃ分からない方は「=」と「*」の評価の順番を意識して(参考:演算子って何?)、変数answerの値がどう変わっていってるのか確認しながら、一行ずつ読んで下さい。要するに2の5乗を計算しています。

このクラスを実行すると、

実行結果
2の5乗は、32

答えも合ってます。しかし、全く同じ文を続けて5回も書くのはプログラムとしてはちょっと不細工だし、面倒です。そこで、登場するのが、for文です。

for文を使えば「{answer = answer * 2;}を5回繰り返しなさい」と書くことが出来るんです。

for文の基本的な使い方

まずは「こう書けたら楽なのに」という例です。次のコードはJavaでは動きません。

PowerOfTwo.java

for (5) {
    answer = answer * 2;
}

これで、「answer = answer * 2;」 を5回繰り返してくれ・・たら楽なんですけど、繰り返し回数の定義はもうちょっと複雑です。「for( )」の「( )」の中に繰り返しの条件を書くのですが、単に何回繰り返すかの数字を入れるわけではありません。

まず「( )」の中を半角の「;」で区切って3つのパート(初期設定、実行条件、継続処理)に分けます。

for文の基本構文

for (初期設定 ; 実行条件 ; 継続処理) {
    ブロック
}

5回繰り返すにはどう書けばいいか、ゆっくりやっていきます。こんな丁寧に書いてるサイトないですよ~。(笑)

まず初期設定のパート、

PowerOfTwo.java

for (int i = 0; 実行条件 ; 継続処理) {
    answer = answer * 2;
}

初期設定は「int i=0」です。int変数 iを宣言して、そこに0を代入しています。この変数 iは繰り返し回数をカウントする為に使います。ここの変数名は別に何でもいいのですが、特に意味なくただのカウントとして使うのであれば普通は「i」を使うことが多いです。

続いて、実行条件のパート、

PowerOfTwo.java

for (int i = 0; i < 5; 継続処理) {
    answer = answer * 2;
}

実行条件は「i<5」です。この実行条件がtrueであればブロックの中が実行されます。

初期設定ではiは0なので、「i<5」はtrueになりますね?というわけで1回目の「answer = answer * 2;」が実行されます。

続いて、継続処理のパート、

PowerOfTwo.java

for (int i = 0; i < 5; i++) {
    answer = answer * 2;
}

継続処理というのは、ブロックの中を実行した後で処理される内容です。その処理をされてから次の周に進みます。

ここでは継続処理は「i++」です。この「++」というのはインクリメントというやつで、int変数の値を1増やしたい時に使います。ここでは iの値を1増やしています。

つまり、「answer = answer * 2;」を実行したら、iの値を1増やして2周目に突入です。最初iの値は0だったので1になったわけです。

2周目以降は、初期設定はもう関係ありません。初期設定の出番は当然ですが最初だけです。

で、2周目も実行条件のチェックです。さっきのインクリメントでiは1に変わっていますが、実行条件「i<5」はtrueになるので、2周目の「answer = answer * 2;」実行です。

で、同じように「answer = answer * 2;」が実行し終わったら、継続処理「i++」で iの値が2になります。そして3周目・・、と続いて行きます。

5周目のブロックを実行した後の継続処理でiの値は5になります。すると6回目の条件判定で実行条件「i<5」がfalseとなります。実行条件がfalseになればブロック内は実行されずにfor文を抜けます。

結果的に「answer = answer * 2;」を5回実行してfor文を抜けるわけです。

PowerOfTwo.java

for (int i = 0; i < 5; i++) { }

↑この形で書けば、実行条件パートの「i<5 」の数字の回数だけ(ブロック内でiの値を変えない場合)繰り返しブロック内が実行されることになるんですね。

勘のいい人はお分かりだと思いますが、5回実行させる為の書き方なんていくらでもあります。

PowerOfTwo.java

for (int i = 1; i <= 5; i++) {
    answer = answer * 2;
}

この書き方でもカウント1から始まって5で終わるので結局5回実行することになるし、感覚的にはこちらの方が分かりやすい気もしますが、普通に○回繰り返しというプログラムをする時は、カウント0から始めて実行条件式は「<=」ではなく「<」を使うのが一般的です。

慣れてきたらいろんな繰り返し条件が書けるようになると思うので、とりあえずはこの基本の形を覚えたらいいと思います。

2のn乗を計算

では、さっきの「PowerOfTwo.java」をfor文を使ってスマートに書き換えましょう。

PowerOfTwo.java

public class PowerOfTwo {
    public static void main(String[] args) {
        int answer = 1;

        for (int i = 0; i < 5; i++) {
            answer = answer * 2;
        }

        System.out.print("2の5乗は、");
        System.out.println(answer);
    }
}

これで2の5乗を計算してくれるプログラムはばっちりです。

けど5乗しか計算できないんじゃあ面白くないので、このプログラムを、何乗するかを整数の変数nで指定して、2のn乗を計算できるように改造しましょう。ここではnを0~30の範囲で指定します。

PowerOfTwo.java

public class PowerOfTwo {
    public static void main(String[] args) {
        int n = 5;
        int answer = 1;

        for (int i = 0; i < 5; i++) {
            answer = answer * 2;
        }

        System.out.print("2の5乗は、");
        System.out.println(answer);
    }
}

例によって手打ち設定で申し訳ないのですが、「int n」を宣言してとりあえず5を代入しています。このnをどうするのかというと、そうです、賢明な読者様ならもうお分かりだと思います。

PowerOfTwo.java

public class PowerOfTwo {
    public static void main(String[] args) {
        int n = 5;
        int answer = 1;

        for (int i = 0; i < n; i++) {
            answer = answer * 2;
        }

        System.out.print("2の" + n + "乗は、");
        System.out.println(answer);
    }
}

これで2のn乗を計算してくれるプログラムの完成です。nの初期化部分を例によって手打ちで書き換えてもらえれば、10乗でも20乗でも一瞬のうちに計算して答えを吐き出してくれます。

nの値を変えていくつか実行した結果を載せておきます。

実行結果(n = 0)
2の0乗は、1
実行結果(n = 8)
2の8乗は、256
実行結果(n = 30)
2の30乗は、1073741824

ただし変数answerはint型なので、正の値は2の31乗−1(2,147,483,647)までしか入りません。このコードで2のn乗を正確に計算できるのは、nが0~30の場合です。ちなみに31乗で計算すると面白い答えがでます。コンピュータが、32bitのメモリ領域で(-2の31乗)から(2の31乗-1)の数値(int型)を保持している仕組みがちょっと分かります。(参考:基本データ型について)

次回はfor文で配列を回すというのをやります。配列とfor文を使いこなせれば本格的なプログラマーの仲間入り??

目次へ

質問・コメント

読み込み中

この記事についての質問や、学習して気づいたことをお寄せください。

コメントを書く

投稿フォームを準備しています。

コメントと一緒に公開される名前です。
3,000文字以内。パスワードなどの個人情報は書き込まないでください。

コメントは送信後すぐに公開されます。

この記事のコメント

旧サイトに寄せられたコメントも当時の投稿内容のまま掲載しています。現在の記事では変更している内容や、旧環境についてのやり取りも含まれます。

コメントを読み込んでいます。