for文の基本

for文も、while文と同じく反復文の一つです。 一般に、決まった回数だけ繰り返して処理を行わせる場合は、こちらのfor文をよく使います。

for文の基本書式は少し難しいので、順を追って見て行きましょう。

(1)一番最初に行う処理を書く

for( 式; )
					

for文は、()の中に書かれた最も左側にある式を一度だけ実行します。 式ならば何を書いてもいいのですが、普通はループ変数の初期化を行います。 例えば次のように書きます。

for ( var i=0; )

この式は省略する事も出来ます。 省略する場合はセミコロン(;)だけを書きます

for ( ; )

(2)処理を継続させる条件式を書く

for( 式; 条件式; )
					

条件式はwhileで指定した「while ( 条件式 )」と同じ動作をします。 ループ変数iが10よりも少なければ、という条件を付けるには次のように書きます。

for ( var i=0; i<10; )

(3)条件式が真の場合の処理を書く

for( 式; 条件式; )
{
    //処理内容
}
					

whileの時と同様に、処理内容全体を{}で囲みます。 条件式が真の時に処理を行う点もwhileと同様です。

(4)「最後に行う処理」を書く

for( 式; 条件式; 最後の処理)
{
    //処理内容
}
					

最後の処理は{}で囲まれた処理内容が終わった後に実行されます。 何でも良いのですが、普通はループ変数を操作します。 最後の処理の終わりにセミコロン(;)は書きません。

for ( var i=0; i<10; i++)

このようにして、条件式が真の場合に処理を行う→最後の式を処理する、とループしていきます。 この文は「ループ変数iが10より少なければ処理を続ける」という反復文になっています。

最後の処理も省略する事が出来ます。

for( 式; 条件式; ;)

これがfor文の基本書式です

挨拶プログラムの改良

では、while文で紹介した挨拶を9回行うプログラムをforで改造してみます。

for( var i=9; i; i-- )
{
    System.inform("こんにちは、お元気ですか?");
}
				

while文では{}処理の外でループ変数を用意し、処理の中でループ変数iの値を増減させていました。 それがfor文では()の中に全て記入することが出来ます。 ですから、for文はwhile文の拡張版とも言えるのです。 しかしながら、場合によってはwhileを使用するほうが簡単に書ける場合もありますので、 状況に応じて使い分ける事が望ましいです。

まずはfor文とwhile文の扱いをしっかりとマスターしましょう。 そのためには、とにかくたくさんのプログラムを書いてみる事です。

for文についてもう一歩

for文も反復文なので、while文で紹介したbreakとcontinueといった、 ループ制御が使えます。

多重ループを扱う

for文やwhile文は、処理内容の中にfor文などを書く事が出来ます。 forやwhile文は一つの文(つまり一つの処理の単位)ですから、 文が書ける場所ならどこにでも書く事が出来ます。そう、while文の中にif文が書けたように。

このように、複数個の反復文によって、何重にもループする事を多重ループと呼ぶ事があります。 掛け算である九九(1×1~9×9)を多重ループを使って実行する例を見てみましょう。(少し難しいです)

var disp=""; //表示する文字を入れる変数

//ループ変数iが9以下なら処理をする
for( var i=1; i <= 9; i++ )
{
    disp += "i="+i+" :";

    //ループ変数jが9以下なら処理をする
    for( var j=1; j <= 9; j++ )
    {
        //計算結果を表示する
        //\tはタブを表すエスケープシーケンスです
        disp += (i*j) + "\t";
    }
    //エスケープシーケンスで改行する
    disp += "\n";
}
System.inform(disp);
				

これまでに得た知識を駆使しないと、このプログラムを読み解くのは困難を極めます。 何が何だか分からない!という方は、最初のほうから読み直す事を推奨します。

よく分からないまま進めると必ず挫折します。 そして、一度挫折してしまうと、なかなか戻って来れないのもプログラムの恐怖なのです。 落ち着いて…一つ一つ理解すれば、必ず分かるはずです。リラックスしましょう

forを二重に使わなければ次のようになります。実際に実行して確認してください。

var disp=""; //表示する文字を入れる変数

//ループ変数iが9以下なら処理をする
for( var i=1; i <= 9; i++ )
{
    disp += "i="+i+" :";
    disp += "\n";
}
System.inform(disp);
				

これなら見慣れた形ですね。ここではループ変数iが9になるまで

disp += "i="+i+" :";
disp += "\n";
				

この処理を繰り返すのです。実行結果が何故改行されているのか?と言うと

disp += "\n";

これが原因です。「\n」って覚えているでしょうか? そう、エスケープシーケンスです。

では、処理内容の中にfor文を書くとどうなるのでしょうか? 実際にやってみましょうか。

var disp=""; //表示する文字を入れる変数

//ループ変数iが9以下なら処理をする
for( var i=1; i <= 9; i++ )
{
    disp += "i="+i+" :";
    
    // for文の中にfor文を入れる!
    // 変数jが3以下なら処理をする
    for (var j=1; j <= 3; j++)
    {
        System.inform("iの値は"+i+"、jの値は"+j+"です。");
        disp += (i*j) + " |";
    }
    disp += "\n";
}
System.inform(disp);
				

これを実行すると鬱陶しいくらいメッセージが表示されますが、 ループ変数iとjの動きが良く分かりますので、一度は実行してください。

結果を見ると、何度も変数jが変動している事に気づくと思います。 jの値が「1、2、3」と変動し、それが9回続きますよね。それもそのはず。

for (var j=1; j <= 3; j++)

この処理が終わって抜けた先は

for( var i=1; i <= 9; i++ )

まだ、このfor文の処理の中だからです。 従って、このfor文で指定された条件…この例では変数iの値が10になるまで処理は続くのです。 (iが9以下なら処理をして「i++」となるので、最後は10になるのは分かりますか?)

このような、反復文を多重に使うという手法はゲームや多くのアプリケーションで必須になる書き方です。 今はまだ完全に理解出来ていなくても、挫折するには早いです。 なんとな~くでも理解出来ていれば、今回は十分合格!です。

多重ループ制御

多重ループがなんとなく理解できると、次の疑問が出てきます。

多重ループの中でbreakcontinueを使うとどうなるんだろう……?

この答えはとても簡単です。 breakなどは{}の中に書かれていますよね?ですから、図に表すと以下のようになります

breakの動作(2)

つまり、while文などの中にある反復文(ここではwhile)の中でbreakを使うと、 抜けるのは、そのbreakが存在している{ }という事です。

var i=1;
while( i )
{
    while ( 1 )
    {
        //このbreakが抜けた先は「--i」の場所
        //つまり、while( 1 )の処理を終わる
        break;
    }
    --i;
}
				

これはcontinueも同じです。

var i=1;
while( i )
{
    var j=9;
    while ( j )
    {
        if ( j >1 )
        {
            //このcontinueはwhile ( j )に戻る
            --j;
            continue;
        }
        --j;
    }
    --i;
}
				

慣れるまでは多重ループ制御に困惑する事も多いと思いますが、 ブロック{}の位置に注目していけば、必ず対応するfor文が見つけられるはずです。 その為にも、ブロック{}毎にインデント(空白)で表示を見やすくする事が重要になるのです。