■繰り返し■
while文
文法的にはc言語とまったく同じwhile文を記述する.
while(条件式) { 条件式がtrueであれば,繰り返し実行される部分 }
通常は,繰り返される部分の中に計算式などを書いておき,その結果次第でwhile文を脱出するようにしておく.
int x=100; while(x>0) { 繰り返される部分 x--; //xを1減らす }
この例は,処理が一回繰り返されるたびにxが減らされ,0になったときに終了する.最初xに100が代入されているので,ちょうど100回ループすることになる.このxのように,ループの回数を指示するための変数のことをループ変数と呼ぶ.
for文
文法的にはc言語とまったく同じfor文である.
ループを記述するときには,ループ変数の初期化と,ループ変数の増減などを書くことが多い.これを書きやすくまとめたものがfor文である.
for(初期化; 条件式; 後始末) { 繰り返す部分 }
先ほどのwhile文の例をfor文を使って書き換えると,次のようになる.ちなみに,C言語ではループ変数をループの外側で宣言しておく必要があったが,Javaでは直接for文の()の中で宣言することもできる.
for(int x=100; x>0; x--) { 繰り返す部分 }
無限ループ
条件式が常にtrueであれば,そのループは終了しない.これを無限ループと呼ぶ.特にfor文では条件式の部分を空白にしておくと,無限ループとして処理される.
while(true) { 無限に繰り返す部分 }
または,
for(;;) { 無限に繰り返す部分 }
二重ループ
画像処理では,全画面を処理するためにfor文の中にfor文を組み込んだ2重ループをよく使用する.
int width=640; //画面の幅 int height=480; //画面の高さ for(int y=0; y<height; y++) { for(int x=0; x<width; x++) { 座標(x,y)についての処理 } }
この場合,内側のxのループ部分で処理を記述する.この動きは,
yが0,xが0の状態 yが0,xが1の状態 yが0,xが2の状態 ↓ yが0,xがwidth-2の状態 yが0,xがwidth-1の状態←ここでxのループが一度終了 yが1,xが0の状態←yがループしてひとつ増えて,xのループを最初からもう一度 ↓ yが1,xがwidth-1の状態←ここでxのループが一度終了 yが2,xが0の状態←yがループしてひとつ増えて,xのループを最初からもう一度 ↓ yが2,xがwidth-1の状態←ここでxのループが一度終了 ↓ ↓ yがheight-1,xがwidth-1の状態←ここで両方のループが終了
ループのbreak
switch文と同じbreak文を,for文やwhile文の中でも使用できる.このときのbreak文は,caseではなく,ループを1つ終了する役割を持つ.ただし,例えば次のような2重ループの場合,yのループは終了しないので注意.
int width=640; //画面の幅 int height=480; //画面の高さ for(int y=0; y<height; y++) { for(int x=0; x<width; x++) { 座標(x,y)についての処理 if(何か条件) { break; } } }
この場合,「何か条件」が生じたとき,xのループを終了するがyのループは終了しないので,次のyの値でループが続行される.
C言語では,このような2重ループを一気に脱出するためにgoto文が用意されていたが,javaでは使用できない.javaでは2重ループを脱出するために,break文を次のように拡張している.例えば次の例では,「何か条件」が生じたときに,ループの回数が規定に満たなくても途中でxのループだけでなく,yのループも一気に終了する.
int width=640; //画面の幅 int height=480; //画面の高さ label_abc: //ラベル名は,好きな名前を指定 for(int y=0; y<height; y++) { for(int x=0; x<width; x++) { 座標(x,y)についての処理 if(何か条件) { break label_abc; //ラベルlabel_abcまで一気に終了 //↑(ここではラベル名の最後に':'は書かない) } } }
ループのcontinue
breakとは異なり,強制的に次のループを実行させるための命令がcontinue文である.次の例では,何か条件が発生した時に,座標(x,y)を処理することなく,xをすぐに1増やして次のループ処理を続行する.
int width=640; //画面の幅 int height=480; //画面の高さ for(int y=0; y<height; y++) { for(int x=0; x<width; x++) { if(何か条件) { continue; } 座標(x,y)についての処理 } }