アットウィキロゴ

Java独学ノート > その3:条件で分岐や繰り返しを行う

この内容をやって行く前に...

ここで、命令文を新しくお教えします。もっと早く教えても良かったかもしれないですが、一応十分演算と変数の知識が付いてからが良いかと思ったので...
今までSystem.out.println()だけを使っていましたが、ここから先、変数の初期数値を変えて検証するためにわざわざコンパイルを繰り返すのは面倒かと思います。そのため、変数と初期化を行っている部分で使ってみてください。
実行して、その文に差し掛かった際に数値を入力できるようになって、入力した数値が変数に入るという命令です。
int x = new java.util.Scanner(System.in).nextInt();

例:
public class ScannerTest0
{
 public static void main(String[] args)
 {
  int x = new java.util.Scanner(System.in).nextInt();
  int y = new java.util.Scanner(System.in).nextInt();
  System.out.println(x + y);
 }
}
例のコードを実行すると、コマンドプロンプトで数値を入力出来るようになり、入力してエンターキーを押す(xに入力した数字を代入)ともう一度数値を入力出来て、また数値を入力してエンターキーを押す(yに入力した数字を代入)と、その2つの数字を足した数字を表示するはずです。

また、この命令文自体が、変数のようにその型のリテラルに変化するという性質があるので、上記と同じ事をこんな感じでやる事も可能です。
public class ScannerTest1
{
 public static void main(String[] args)//メインメソッド
 {
  System.out.println(new java.util.Scanner(System.in).nextInt() + new java.util.Scanner(System.in).nextInt());
 }
}

これは他の型用の命令も存在します。ただしchar型用の命令は存在しません。
boolean x = new java.util.Scanner(System.in).nextBoolean();
byte x = new java.util.Scanner(System.in).nextByte();
short x = new java.util.Scanner(System.in).nextShort();
long x = new java.util.Scanner(System.in).nextLong();
float x = new java.util.Scanner(System.in).nextFloat();
double x = new java.util.Scanner(System.in).nextDouble();
String x = new java.util.Scanner(System.in).nextLine();
longの場合、10のようにlを付けずに入力してください。
floatの場合、1.1のようにfを付けずに入力してください。
float、doubleは10のように整数を入れても機能します。

所で、配列と同様new演算子を使っていますが、これはオブジェクト指向の知識が必要なのでその際お教えします。
また、ちゃんとした入力をしないと例外と呼ばれるエラーを起こして途中で終了してしまいます。この例外と対策方法についてもその際お教えしますので、今は気を付けてくださいとだけ言っておきます。

さて、プログラムの流れ(制御構造、制御フロー)は、順番通り処理を行う順次、その時点での条件によってする処理を変える分岐、条件を満たすまで処理を繰り返す繰り返しの3つが代表的で、その3つで全ての事ができるとされています。
その中の分岐と繰り返しについてやっていきます。

条件分岐

分岐の基本と条件の定義

もしこのようになっていたら、この中の文を実行する、そうでなかったら中の文は実行しないという文の事をif文と言い、Javaではこのように書きます(C言語を祖先に持つものは基本これだったりします)。
if(条件){条件がtrueの時に実行して欲しい文}

条件は(最終的に)boolean型(になるもの)を使います。以下は原理をそのまま使ったコードです。
public class If0
{
 public static void main(String[] args)
 {
  if(true)//()の中にboolean型のリテラルを入れた
  {
   System.out.println("trueなのでメッセージを表示します");//この中にはいくらでも文を入れられる、trueの場合は入れた文をすべて順番通りに行う
  }//何か処理をする文ではないので;はいらない
  System.out.println("プログラムを終了します");
 }
}
これをコンパイルして実行すると、
trueなのでメッセージを表示します
プログラムを終了します
と表示されるはずです。
一方、trueをfalseにするとプログラムを終了しますとだけ出てきます。ifの後の()の中がfalseの場合、中括弧の中の文は実行されません。

さて、今trueかfalseが入ってる部分に、その文を実行したい時にはtrue、したくない時にはfalseになるようにする事で条件によってやることが変わるようになります。これが条件分岐です。
試しに2つの数字を足し算して10になるときにメッセージを表示するように条件分岐してみましょう。変数を足し算して10になるときはtrue、そうでなければfalseになる演算をして、それをif文の()の中に入れます。
public class If1
{
 public static void main(String[] args)
 {
  int x = 6;//1つ目の数字
  int y = 4;//二つ目の数字
  boolean b = x + y == 10;//xとyを足し、関係演算子==で10であるならtrue、それ以外ならfalseに変化し、代入演算子=でbに代入
  if(b)//boolean型の変数を入れた、この例ではtrue
  {
   System.out.println("trueなのでメッセージを表示します");
  }
 }
}
この場合xは6、yは4なので6+4で10、つまりbにtrueが入ります。
そしてifの()の中で変数bは中身であるtrueに変化し、if文の内容を実行させた感じです。
試しにx、yの数字を変えてみましょう、足して10以外になる数字では文章が表示されず終了するはずです。

また、()の中でも演算は可能なので、このようにも表現できます。というかこれが基本形だったりします。
もちろん結果は上記と同じです。
public class If2
{
 public static void main(String[] args)
 {
  int x = 6;//1つ目の数字
  int y = 4;//二つ目の数字
  if(x + y == 10)//中で演算、例の場合は関係演算子==で最終的にtrueになる、()の中の場合は;はいらない
  {
   System.out.println("trueなのでメッセージを表示します");
  }
 }
}
逆に上記のようにboolean型の変数を使う場合は稀です、途中の条件分岐で他の処理をしつつtrueやfalseに変化していって、最後の処理をどうするかがその変数で決まる、
あるいは色々条件分岐があって、どれかが引っかかったらfalseにして最後の条件分岐を行わない、などなど...有用なテクニックなので覚えて損はない...と思います。

演算の復習になりますが、もし10以外の時だけ文章を表示させたい時は、この場合は以下の方法があります。
boolean b = x + y == 10; if(!b)//boolean型の変数がtrueに変化し、論理演算子!でfalseに変化
if(x + y != 10)//合っている場合はfalseになる関係演算子
if(!(x + y == 10))//!は加減乗除の演算子より優先されるので評価後boolean型になる式を()で囲いその前に付ける、&&や||を使った複雑な式をまとめて反転させるときなどに使うテクニック

条件と違う場合にも何か実行する

if文を使う上で、条件と違っていたら違っていたで、別の事をして欲しい時っていうのは多くあります。
論理演算子!を使って反転させた条件文を入れたif文を付けても良いのですが(非推奨)、この時使うのはelse文です。

以下のように、else{}をif文の後に付ける事で、if文の条件が成立しない時に中括弧の中の内容を実行します。
public class If3
{
 public static void main(String[] args)
 {
  int x = 6;
  int y = 4;
  if(x + y == 10)
  {
   System.out.println("結果はtrueです");
  }
  else//x + y == 10がfalseになる場合
  {
   System.out.println("結果はfalseです");
  }
 }
}
これをこのままコンパイルして実行すると結果はtrueですと表示されます。
逆に、たとえばx = 5にするとx + yは9、9 == 10という演算が行われてfalseになりif文の内容は実行されず、代わりにelse文の内容である、結果はfalseですという文章が表示されます。

ちなみに、else(条件){内容}と書いて条件がfalseだと実行されるみたいにする事は出来ませんのであしからず(コンパイルエラーになる)。

また、これもif文で出来るっちゃあ出来るのですが、便利な書き方でelse-if文というものがあります。
これは、最初のif文に付けることで、最初のif文の条件に当てはまらず(false)、なおかつelse-if文の条件には合う(true)場合にその内容が実行される文です。
このelse-if文の後にさらにelse文、もしくはelse-if文をつなげる事もできます。
前者は最初のif文から後続のelse-if文全ての条件で全てfalseが出た場合にだけ実行されます。
後者は最初のif文から後続の、自分自身より前のelse-if文までの条件でfalseが出て、自分自身の条件でtrueが出た時のみ実行し、後に続くelse文、もしくはelse-if文は無視されます。
以下は一例です。変数xに入っている数字が5を基準に大きいか小さいかを表示します。
public class If4
{
 public static void main(String[] args)
 {
  int x = 6;
  if(x < 5)//xが5より小さい
  {
   System.out.println("xは5より小さい数字です");//x < 5がfalse、つまり5以上ならこの文は表示されず、trueならこれだけ表示されて後の繋がってる2つの文はelse文まで無視される
  }
  else if(x > 5)//xが5より大きい場合、なおかつxが5より小さくない場合(小さかったらif文の内容を実行してここをスルーしているはずなので)
  {
   System.out.println("xは5より大きい数字です");//これが表示されて繋がっているelse文は無視
  }
  else//xが5より小さくなく、さらに大きくなかった場合
  {
   System.out.println("xは5です");
  }
 }
}
このままコンパイルして実行すると、xが6なので、if文は、条件がxが5未満の時なのでfalseになり内容は無視され、次のelse-if文、条件がxが5を超える時なのでtrueになり、xは5より大きい数字ですと表示、ここでtrueが出たので後のelse文は無視されます。
仮にxが4の場合、if文の条件でtrueが出る(4 < 5が成立する)のでif文の内容である、xは5より小さい数字ですという文を表示する処理がされ、以降のelse-if文とelse文はtrueが出たので無視されます。
xが5の場合、if文の条件はfalseで次に行き、次のelse-if文の条件もfalseなので、次のelse文の内容である、xは5ですという文を表示する処理が行われます。

ここまでをまとめると、条件分岐は、if文から始まり場合によってelse-if文が連なり、最終的に場合によってelse文で締める、これが一まとまりとして見ることができます。

所で、今までやったif文、if-else文、else文は、もしも中身の文が一つだった場合、つまり終端の";"が1つだけの場合は中括弧を省略することができます。
推奨していない参考書等もありますが、うまく使えばよりすっきりとしたコードを書くことができます。

上記二つの内容を踏まえ、以下のコードを見てください。...参考程度に。

public class If5
{
 public static void main(String[] args)
 {
  int x = new java.util.Scanner(System.in).nextInt();

  //条件分岐その1、この中のどれかが必ず行われる
  if(x < 0)
   System.out.println("xは負の数です。");
  else if(x >= 10)
   System.out.println("xは二桁以上の数です。");
  else if(x < 5)
   System.out.println("xは5より小さい一桁の数です。");
  else
   System.out.println("xは5以上の一桁の数です。");
  //ここまでのどれかが行われる

  //条件分岐その2、else文が無いため、これらの条件のどれにも一致しない場合は何も起きない
  //上記とは違う書き方だが見やすさの違いだけ
  //この章の終わりに詳しく解説するが、コードの書き方って意外と自由
  if(x <= 0)           System.out.println("xについての情報は特にありません。");
  else if (x % 10 == 0)System.out.println("xは10の倍数です。");
  else if(x % 5  == 0) System.out.println("xは2の倍数ではなく5の倍数です。");//10 = 2 * 5なので最初の条件に引っかからなければ2の倍数ではない
  //ここまでの条件に全て当てはまらない場合は何も起きない

  //条件分岐その3、最後にelseがあるが、条件で行う内容が空の部分もあるので何も起きない事も
  if(x <= 0)         ; //;だけ書くと何もしない(内容の無い文)、この記載法で後に何も書かないと後の文を条件でやる内容にしたり、if文なら入れ子にしてしまったりしてしまう、この書き方は特に非推奨
  else if(x % 2 == 0)System.out.println("xは偶数です。");
  else               System.out.println("xは奇数です。");
  //xが0以下でなければどっちかが表示される
 }
}
これをコンパイルして実行すると、始めに紹介した命令により、数字が入力できるようになると思います。
数を入力してエンターキーを押すと、その数がxに代入されます。
色々な数で試して、想像した通りの表示がされるか確認し、条件分岐の理解が深まったら...と思います。

変数の内容に応じた処理をする

if文はその内容を実行するべきか、関係演算子や論理演算子で確かめて決める方法でした。
一方、変数の中身によって実行する事を変えるという条件分岐も存在します。その方法で実行内容を分岐するにはswitch文を使います。

switch文で使えるのはbyte、short、int、char、String型*1で、逆にlong、float、doubleは使えません。

switch文は以下の文を中に入れて使います。
  • caseラベル
    • 変数の中身が表記されたリテラルと同じ場合そこから始める
    • if文やif-else文のポジションで、(基本型でいう)変数==リテラルが条件
case リテラル:
例)
case 0:
case '字':
case "文字列":
  • defaultラベル
    • switch文内のすべてのラベルと一致しない場合ここから始める
    • else文のポジション
default:
  • break文
    • ここに到達した場合、現在処理してるswitch文の中から出る
break;
ラベルはコロン(:)、break文はセミコロン(;)なので気を付けてください。

以上を踏まえ、こちらをご覧ください。
public class SwitchTest
{
 public static void main(String[] args)
 {
  System.out.println("0~9の数を入力してください");
  int x = new java.util.Scanner(System.in).nextInt();//xに入力した数字を代入

  switch(x)
  {
   case 0://xが0の場合ここから開始
   System.out.println("xの中身は0です");
   break;//break文により、xが0の場合はここまでの文を実行してswitch文から出る

   case 1://xが1の場合ここから開始、途中caseラベルがあるが、あくまで開始の目印なのでswitch文を抜けたりはしない、以下同様
   case 2://xが2の場合ここから開始
   case 3://xが3の場合ここから開始
   case 4://xが4の場合ここから開始
   System.out.println("xの中身は5未満です");
   System.out.println("5以上だったら偶数かどうかも判定します");
   break;//1~4の場合ラベルからここまでの文、つまりこの2つの文が実行されてswitch文から出る

   case 6://xが6の場合ここから開始
   case 8://xが8の場合ここから開始
   System.out.println("xの中身は偶数です");
   //break文が無いので、6か8の場合でもここで止まらない
   case 5://xが5の場合ここから開始
   case 7://xが7の場合ここから開始
   case 9://xが9の場合ここから開始
   System.out.println("xの中身は5以上です");//6か8の場合でもこの文が読まれる(break文がないため)
   break;//5~9の場合ラベルからここまでの文、つまり1つか2つの文が実行されてswitch文から出る

   default://ここのcaseラベルに無い、0~9までの数字だった場合。この下にcaseラベルがあっても問題なく、defaultの条件から除外される条件を増やす
   System.out.println("範囲外です");//終端なのでわざわざbreak文を書かなくてもここから出る
  }
  System.out.println("プログラムを終了します");//switch文を出た後なので変数に関係なく表示
 }
}
これの実行結果は以下になります。
0~9の数を入力してください
(数が入力できるようになる)

(0を入れた場合)
xの中身は0です
プログラムを終了します

(1、2、3、4のどれかを入れた場合)
xの中身は5未満です
5以上だったら偶数かどうかも判定します
プログラムを終了します

(5、7、9のどれかを入れた場合)
xの中身は5以上です
プログラムを終了します

(6、8のどれかを入れた場合)
xの中身は偶数です
xの中身は5以上です
プログラムを終了します

(10や-1など範囲外の数を入れた場合)
範囲外です
プログラムを終了します

このように、switch文はcaseラベルやdefaultラベルを開始位置として付け、停止したい所でbreak文を置くという構造になっています。

理解を深めるために一応...というかもっと分かりやすい形で...今まで
if(x == 0){(内容)}
else if(x == 1){(内容)}
else if(x == 2){(内容)}
else{(内容)}
とやっていたものを、
switch(x){
case 0: (内容) break;
case 1: (内容) break;
case 2: (内容) break;
default: (内容)}
とやることができます。

ちなみに開始位置であるdefaultラベルや同じ内容のcaseラベルを複数一つのswitch文に入れる事はできません。
あと、他のプログラミング言語で存在する、ここにきた時点で別のラベルに移動してそこから処理するgoto文はjavaでは存在しません。

変数によって停止位置を変えたい場合、中にif文を入れ込むという形で実現することが可能です(後述)。
あとbreak文ですが、これは繰り返しでも使います。break文は現在いる階層(if文などならその上、一番下のswitch文か繰り返し)から抜け出すという性質をよく理解しておいてください。

繰り返し

条件が満たされている間繰り返す

繰り返しのやり方の一つに、while文があります。
while(条件){条件がtrueの時に実行して欲しい文}
このように、形状はif文と同じですが、if文と違いもう一度条件の所に戻るという特徴があります。

以上を踏まえ、まずは基本的な使い方を見てみましょう。
public class While0
{
 public static void main(String[] args)
 {
  System.out.println("0と入力してください");
  int x = new java.util.Scanner(System.in).nextInt();

  while(x != 0)//最初に0を入れたらfalseなのでスルー、それ以外ならtrueでif文のように中身を実行、終端でここに戻ってtrueならまた実行
  {
   //条件でtrueが出たら中身を実行
   System.out.println("0と入力するまで終わりません");
   x = new java.util.Scanner(System.in).nextInt();//入力しなおし、ここで終端なので、条件の所に戻ってx != 0を演算してループするかどうか判定
  }

  //while文から出た場合。while文の終端にたどり着いて、条件の部分に来てfalseだったらループを抜け出しここに来る
  System.out.println("プログラムを終了します");
 }
}
さて、実行したら0と入力してくださいと表示され、数字の入力を求めて来ます。
  • 最初に0を入れる
    • プログラムを終了しますと表示して終了
      • while文の条件でfalseが出たので中身をスルーしてその後を実行
  • 最初に1など別の数字を入れる
    • 0と入力するまで終わりませんと表示して入力を再度求める
      • 条件でtrueが出たので中身を実行
    • 次に0と入力する
      • プログラムを終了しますと表示して終了
        • 入力を求める命令の次が終端で条件の部分に戻り、falseが出るのでwhile文の内容はスルーして次の内容を実行
    • 次にまた0以外の数字を入力する
      • 0と入力するまで終わりませんと表示して入力を再度求める(※に戻る)
        • 入力を求める命令の次が終端で条件の部分に戻り、trueが出るのでwhile文の内容を再度実行
このようなフローチャートになります。

所で、while文は終端で条件の部分に戻る、あとif文では括弧の中で演算している(while文も同じ)と書きましたが、それが分かるコードをもしよろしければ見てみてください。
実際は代入演算子を条件文の中で使う事は推奨しません。
public class While1
{
 public static void main(String[] args)
 {
  int x = 0;

  while((x += 1) <= 5)//xに1追加した後5以下かどうか確認、代入演算子の方が後で判定されるので括弧を付ける
  {
   System.out.println(x);
  }
 }
}
実行結果はこのようになります。
1
2
3
4
5

原理的には、最初は0の数にwhile文の条件でxに1足すという演算をして、それが5以下かどうかを演算してtrueが出るので、while文の中身であるxの内容を表示する処理をし、そしてwhile文の条件の所に戻ります。
したらまた条件の所に戻り、xに1足すという演算をして、それが5以下かどうかを演算してtrueが出るので、while文の中身であるxの内容を表示する処理をし、そしてwhile文の条件の所に戻ります。
これを繰り返し、xが条件に来た時点で5だった場合、xに1を足して6になり、5以下という関係演算子でfalseになるのでwhile文の内容は行わず6とは表示されずに終了するという感じです。

また、while文の派生で、中身はかならず一回行われ、終端で条件演算がされるdo-while文があります。

これがdo-while文の一例です。上記While1と同じ条件にしています。
public class While2
{
 public static void main(String[] args)
 {
  int x = 0;

  do//条件文に関係なくまずここの内容をやる
  {
   System.out.println(x);
  }
  while((x += 1) <= 5);//do-while文の場合終端にセミコロン(;)が必要なので注意
 }
}
実行結果は以下のようになります。
0
1
2
3
4
5

While1と違い0が出てきました。これは条件文を通らずにxの内容を画面に表示する命令に従ったため、1を追加されずにxの内容を表示したためです。
実行した後はxに1足して5以下か調べ、trueならdo文の最初に戻ります。最初はxは0で、1足してxの中身は1、それは5以下なのでtrueになりますね。
そしてxが5の時にwhile文に差し掛かると、xに1足されて6、5以下ではないのでfalseとなりdo文の最初には戻らずそのまま次の内容を行います。

ところで、do-while文は条件文に関係なく1回は内容を実行すると書きました。
そのため、
while(false)
{
 System.out.println("メッセージを表示");
}
これは条件のfalseが引っかかり何も表示されませんが、
do
{
 System.out.println("メッセージを表示");
}
while(false);
この場合は一度「メッセージを表示」と表示します。
その後はwhile(false)とあるため繰り返しません。
元から条件を満たしてないと実行しないwhile文に対し、do-while文は条件を満たしてなくても必ず1回は実行します。

一定回数分繰り返す

繰り返しをやる上で、繰り返す回数自体はすでに(変数かリテラルで)数字として出ている場合というのは多くあります。
この時に使う文としてfor文があります。
実際の所、繰り返しはこのfor文を一番多く使うと思います。

このfor文には3つの要素が存在し、最初にやる事(初期化処理)、繰り返しの条件(while文の括弧の中身と同じ)(繰り返し条件)、終端に差し掛かった時にやる事(繰り返し時処理)があります。

そして一般的なfor文では、それぞれ...
  • 初期化処理
    • 例)int i = 0
      • 繰り返しのために整数型の変数を定義
      • このような変数を(ループ変数)と言い、多くの場合はi、for文の中身でfor文を使うなどiが使えない時はjを充てる場合が多い
  • 繰り返し条件
    • 例、3回繰り返す場合)i < 3
      • i < (繰り返したい回数)が一般的、これで3回繰り返される原理は後述
  • 繰り返し時処理
    • i++
      • 終点でiの中身を1増やす
このように書かれます。

原理を言う上で、このコードを見てください。
public class For0
{
 public static void main(String[] args)
 {
  for(int i = 0; i < 3; i++)
  {
   System.out.println(i);
  }
 }
}
このように、for文の括弧の中はセミコロン(;)で区切ります

ちょっと形を変えて解説していきます。
//1週目:
for
(
 int i = 0;//最初にiというint型の変数を定義、0で初期化
 i < 3;//次にfor文の中身を行うか確認、iは0なので実行
 i++//ここはここの時点では何も行われない
)
{
 System.out.println(i);//iの内容を表示、i++が行われるのはこの後なので0と表示
}
//2週目:
for
(
 int i = 0;//最初だけなので何もしない、以下同様
 i < 3;//下記繰り返し時処理(i++)実行後for文の中身を行うか確認、iは1なので実行
 i++//戻ってきたので上記繰り返し条件(i < 3)より先に実行、iに1足して1に
)
{
 System.out.println(i);//iの内容、1と表示
}
//3週目:
for
(
 int i = 0;
 i < 3;//i++の後で、iは2なので実行
 i++//戻ってきたのでiに1足して2に
)
{
 System.out.println(i);//iの内容、2と表示
}
//4週目:
for
(
 int i = 0;
 i < 3;//i++の後で、この時点でiは3なので実行しない
 i++//iに1足して3に
)
{
 System.out.println(i);//繰り返し条件がfalseだったので実行されない
}
このような原理で、i < 3の数字の文だけ繰り返されます。

って事で、上記For0を実行するとこのように表示されるはずです。
0
1
2

さて、この0から始めるというプログラマの風習ですが、慣れておいた方が良さそうです。何しろ色々なものが0から始まるように出来ているので...
たとえば配列、これも0で始まりますね。
このように配列の要素それぞれに何かを行うコードを書く時に0から始まる事が影響します。
まあ、これは次の節で特別でスマートな書き方がありますが...
public class For1
{
 public static void main(String[] args)
 {
  int[] array = {0, 1, 2, 3};
  //配列の中身を表示して配列の大きさ分足す
  for(int i = 0; i < array.length; i++)//lengthは1から数えるのでこの例だと4になる
  {
   System.out.println(array[i]);//一週目はi = 0なので、array[0]の中身である0を表示、二週目はarray[1]の中身である1を表示
   array[i] += array.length;//この場合だと一週目にarray[0]に4を足す
  }
  //配列の中身を表示、上記で配列の大きさ分足したので中身は{4, 5, 6, 7}になる
  for(int i = 0; i < array.length; i++)//for文で定義したiは上記のfor文までしか存在できないので競合しない、詳しくは後述
  {
   System.out.println(array[i]);//一週目はi = 0なので、array[0]の中身である4を表示、二週目はarray[1]の中身である5を表示
  }
 }
}
この実行結果はこのようになります。
0
1
2
3
4
5
6
7
最初の配列を{0, 1, 2, 3, 4}にすれば9まで表示されます。原理は自力で解き明かしていただけたら...幸いです。

配列で使える便利なfor文

配列などのデータ構造のそれぞれの内容に同じ処理をしたい時のために、拡張For文と呼ばれる特殊なFor文が用意されています。これはJava5から実装された要素です。

拡張For文はこのように書き表します。
for(要素の型 変数名: 配列の変数名){内容}
例)
int[] array = {0, 1, 2};
for(int value: array){}
それぞれの内容を説明すると、要素の型は配列の要素、つまり中身の型を記載します。
変数名ですが特に規定はありません。この変数は、例で言えばarray[i](iは何週目か0から数えた数)として扱われます。
配列の変数名に関して何か言うとすると、もし多次元配列であれば、例えば二次元目の配列を扱うならarray[]と入力して、要素の型も二次元ならint[]、三次元ならint[][]と入力します。

それを踏まえて、For1と同じものを拡張For文で書いたものがこちらです。
public class For2
{
 public static void main(String[] args)
 {
  int[] array = {0, 1, 2, 3};
  //配列の中身を表示して配列の大きさ分足す
  for(int value: array)//array[i]がvalueという変数に置き換わる
  {
   System.out.println(value);//一週目はarray[0]の中身である0を表示、二週目はarray[1]の中身である1を表示
   value += array.length;//一週目にarray[0]に4を足す、二週目はarray[1]に4を足す
  }
  //配列の中身を表示、上記で配列の大きさ分足したので中身は{4, 5, 6, 7}になる
  for(int value: array)//for文で定義したvalueは上記のfor文までしか存在できないので競合しない、詳しくは後述
  {
   System.out.println(array);//一週目はarray[0]の中身である4を表示、二週目はarray[1]の中身である5を表示
  }
 }
}

他のデータ構造に関してですが、それらはオブジェクト指向の知識が必要なのでその際改めてお教えします。

入れ子構造、複雑な流れのプログラム

スコープ

スコープとは、変数がどこまで存在できるかの範囲を言います。
ひとまず、こちらのコードをご覧ください。
public class Scope0
{
 public static void main(String[] args)
 {
  if(true)
  {
   int i = 0;
  }
  else
  {
   int i = 1;
  }
  i += 1;
  System.out.println(i);
 }
}
これをコンパイルするとこんなエラーが発生します。
Scope0.java:13: エラー: シンボルを見つけられません
  i += 1;
  ^
  シンボル:   変数 i
  場所: クラス Scope0
Scope0.java:14: エラー: シンボルを見つけられません
  System.out.println(i);
                     ^
  シンボル:   変数 i
  場所: クラス Scope0
エラー2個

シンボルを見つけられない、つまり、iという変数が見当たらないというエラーが出てきました。
if文とelse文、つまり必ずどちらかが行われる文でiという変数を宣言したので必ず変数iが存在するはずです。しかしその下ではiという変数を認識出来ていないって事です。
ここで重要なのは、

break文とcontinue文

While文やFor文、その派生

終わりに

インデント

最終更新:2021年09月20日 22:49

*1 相当後で説明する列挙型も使えます