ループ文
ループ文とは、「ある条件を満たしている間は、同じ処理を繰り返す」という命令文です。
for文
for ( 初期値; ループを繰り返す条件式; ループ回数をカウントする式 ){ A }
for文は、ある変数が、指定した値になるまでループする、というループ文を書く場合に使います。
「初期値」には、変数の初期値を書きます。たとえば、カウントする変数にiを用いる場合には、i=0;などと書きます。
「ループを繰り返す条件式」とは、「変数iがこの条件式の結果に収まるならばループを繰り返す」という意味です。たとえば、i<10;のように書きます。
「ループ回数をカウントする式」には、1回ループを実行するたびに変数の値を変化させる式を書きます。たとえば、i=i+1などと書きます。
最後の「A」には、ループを繰り返している際に、実行する命令文を書きます。たとえば、j=j+i;などと書きます。
以上の例をfor文にあらわすと、以下のようになります。
if ( i=0; i<10; i++ ) { j=j+i; }
これは、変数iの値を0から数えはじめて、ループごとに1ずつ加算していき、9になるまでループを繰り返す、という意味です。0から9までということは、つまり10回ループを繰り返すということです。
また、その10回のループの最中に、毎回、変数jに変数iの値を足していきます。
このループ文を実行すると、変数jの値は45になります。
for in
for ( 変数名 in 配列名又はオブジェクト名 ){ A }
for inを使うと、配列の要素の数(又はオブジェクトのプロパティの数)だけループします。ある配列の要素をすべて取り出して処理を行いたいときなどに使います。
たとえば、それぞれxxx,yyy,zzzという値が代入された3つの要素を持つ配列xがあるとします。この配列xの内容を取り出して表示するには、以下のようにします。
for ( i in x ){ trace(x[i]); }
traceは、flashの作業画面に指定した処理を表示する関数です。
このときは、xxx,yyy,zzzが順番に表示されます。
なお、以下のように書いた場合には、0,1,2が表示されます。
for ( i in x ) { trace(i); }
オブジェクトのプロパティに大してfor inを使う場合
オブジェクトは、結合配列と呼ばれる変数構造で構成されています。配列が要素と値から成るのに対し、結合配列は、キーと値から成ります。
簡単にいうと、配列の要素は、数字で、先頭(0)から順番に自動的に決められていきます。配列の各要素の値を取り出すには、「配列[要素の番号]」のように書きます。
これに対し、結合配列は、要素の代わりにキーに値を割り振ります。このキーは、自分で好きな名前を付けることができます(半角英数)。結合配列のキーの値を取り出すには、「結合配列.キー」のように書きます。
var OBJ:Object = { data1:"値1", data2:"値2", data3:"値3"};
for ( i in OBJ ) { trace(i); }
上の例では、OBJというオブジェクトに、キーdata1~data3を指定し、それぞれのキーに値1~値3を代入しています。
次のfor in文においては、OBJのキーの数でループし、変数iには、各キーに対応する値が代入されます。したがって、値1,値2,値3が出力されます(結合配列の場合は表示順はランダムになります)。
for each in
for each ( 変数名 in 配列名又はオブジェクト名 ) { A }
for each inを使うと、配列の要素の値又は、オブジェクトのキーの値の数でループします。
for inでは、要素の数又はオブジェクトのキーでループしていたので、以下のような場合、変数iには、要素の数(数字)又はオブジェクトのキー名が入りました。
for ( i in 配列 ) 又は for ( i in オブジェクト )
しかし、for each inでは、以下のように書くと、変数iには配列の値、又はオブジェクトのキーの値が代入されます。
for each ( i in 配列 ) 又は for each ( i in オブジェクト )
while文
while ( 条件式 ) { A }
whileを使ったループ文は、「条件式」を満たしている間は、命令文Aを実行し続ける、という意味になります。たとえば、条件式をi<10にして、Aをj=j+i;i++;にすると、以下のようにかけます。
while ( i<10 ) { j=j+i; i++; }
while文では、for文のようにループをカウントする変数を予め設定することがありません。上記の場合は、変数iが10より少ないうちは必ず{ }内の命令文を実行する、ということになるので、もし、i++;という一文がなければ、永遠にj=j+i;を実行し続けることになります。これを無限ループといい、処理を永久に抜け出すことができず、プログラムの進行はそこで止まってしまいます。
while文を書くときは、必ずループを抜け出すことができるように、条件式に指定した値に変化を起こすような式を、{ }内に書きます。
do while
do { A } while ( 条件式 );
while文と似ていますが、do while文は、do{ }内に命令文を書きます。do while文は、この命令文Aを最初に実行します。その後、条件式を評価してループを行います。
ループ文の入れ子
ある文の中で同じ構造の文をさらに記述することを、「入れ子」といいます。ループ文でも「入れ子」をつくることができます。ループ文の入れ子とは、たとえば以下のようなものです。
for ( i=0; i<10; i++){
for( j=0; j<5; j++){ k++; }
}
上の式では、変数iの値が9になるまで{ }内の命令文を実行しますが、{ }内には、「変数jの値が4になるまでk++;の式を実行せよ」、というループ文がさらに書かれています。
このループを実行すると、変数kの値は50になります(iのループを10回、jのループを5回繰り返している間に1ずつ加算していくので、10x5=50)。
ループを途中で抜ける
break
現在のループを強制的に終了して、抜けます。
for( i=0; i<10; i++){ j=j+i; break; }
この例では、本来ならば変数iが0から9になるまで、10回ループを繰り返すところを、最初のj=j+iを実行した後に、breakにより、ループを抜けるため、変数jの値は0になります。
breakは、その内部に書いたループ文のみから抜け出します。つまり、入れ子構造のループ文の、2番目のループ文内にbreakを書くと、2番目のループを抜け出すことはできても、1番目のループ文は抜け出せません。
continue
残りの処理をスキップして、次のループに移ります。
for ( i=0; i<10; i++){
if ( i>5 ){ continue; }
j=j+1;
}
上の例では、変数iが9になるまで、次の{ }内の命令文を実行します。{ }内では、変数iが5よりも大きい場合には、残りの処理をスキップして次のループに移ります(変数iには1が加算されます)。変数iが5以下のときは、変数jに1を加算してから次のループに移ります。
この場合、変数jの値は5になります。
入れ子のループを一気に抜ける、一気にスキップする
入れ子になっているループ文を一気にすべて抜け出す(又はスキップする)には、labelを使います。
labelとは
labelを使うと、プログラムの指定した箇所に名前を付けることができます。labelをつけるには、行の先頭に、「ラベル名:」と書きます。ラベル名には、半角の英字+数字を使います。
labelを使ったループ文の入れ子
LABEL1:
for ( i=0; i<10; i++){
for( j=0; j<5; j++){
k=k+1;
break LABEL1;
}
}
「break ラベル名;」で、指定したラベル以下に書かれた処理を抜けることができます。
上記の例では、一番外側のfor文に「LABEL1」というラベル名をつけており、入れ子になっているfor文の中で、「break ラベル名;」を指定しているので、変数kは、最初の1回のみ1が加算されるので、変数kの値は1になります。
同様のことは、continueでも可能です。その場合は「continue ラベル名;」と書きます。
関連リンク
よく読まれている記事
- 右クリックメニューの表示が遅い【Information】
- 画像の一部にリンクを貼る(クリッカブルマップ【Dreamweaver】
- 一定時間でローテーションする広告【JavaScript】
- Dreamweaver【Dreamweaver】
- クリックした画像を拡大・縮小する【JavaScript】
UpDate:2011-7-22