■繰り返し■

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)についての処理
  }
}