■繰り返し■
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)についての処理
}
}