なんとなくわかるJava入門#6 条件分岐編
こんにちは。
今回は条件分岐編です。今回の目標は「if文を理解する」です。
これまでの復習
これまでに学習した内容について簡単に復習してみましょう。読むだけでも良いですが、可能であれば、Eclipseを起動し、次の名前のプロジェクトとJavaファイルを作って下さい。やり方が分からない人は、実際に動かしてみる編の記事を参照してください。
プロジェクト名:ConditionalBranch
クラス名:CondBranchMain
public class CondBranch {
public static void main(String[] args) {
System.out.println("復習します。");
int i = 3;
double d = 2.5;
double ans = (int)d + i * d;
}
}
プログラムは、基本的に上から下に順に実行(順次)されます。
「System.out.println("復習します。");」は、「復習します。」という文字列が表示されます。
「(int) d」は、キャスト演算子による明示的型変換です。double型の値をint型に変換します。
演算子として+と*がありますが、*の方が優先して実行されます。したがって、「i * d」を評価し、その後、「int型に変換されたdの値」と「i * dの結果」が加算されます。
また、「i * d」は、int型とdouble型の計算なので、型の大きい方であるdouble型にint型の値を変換してから計算が行われます。この型変換のことを、暗黙的型変換と呼びます。これら演算について、型変換についてそれぞれ過去の記事で説明しているので、分からない方は参照して頂けたらと思います。
このプログラムを実行した結果、変数ansには、次のうちどちらの値が入っているでしょうか?
a ) 9.5
b ) 10
どちらになるかは、今回の学習内容である「条件分岐」を使って確認してみましょう。
条件分岐
if-elseの構文
条件分岐の仕組みを使うことで、これまで上から下に行われていた実行の流れを条件に応じて分岐させることができます。
今回はプログラムの書き方から覚えていきましょう。
このような if から始まるひとまとまりの文のことを、「if文」と呼びます。
条件式①には、結果がboolean型の値(つまり、true or false)になるような式を記述します。典型的なものとしては、比較演算子( == とか、> とか)が用いられている式を記述します。
実行順としては、まず、この条件式が実行され、その結果が真であれば、直後の「{}」の中の記述が実行されます。もし、偽であれば、elseの直後の「{}」の中の記述が実行されます。
では、復習のプログラムのansの結果について、この条件分岐を使って確認してみましょう。以下のようにプログラムを書き換えます。
public class CondBranch {
public static void main(String[] args) {
System.out.println("復習します。");
int i = 3;
double d = 2.5;
double ans = (int)d + i * d;
if (ans == 10) {
System.out.println("正解は10です。");
} else {
System.out.println("正解は9.5です。");
}
}
}
if文の条件式には、「ans == 10」と記述されています。「==」は左辺と右辺の値が一致すればtrue、一致しなければfalseとして評価される演算子でしたね。
したがって、ansが10であれば、「正解は10です。」と表示され、ansが10でなければ、「正解は9.5以外です。」と表示されます。
ただし、このプログラムは表現している内容が正しくありません。なぜなら、ansが10ではないからといって、9.5とは限りません。次のif-else if-elseの構文を理解して、このプログラムを修正しましょう。
if-else if-elseの構文
実は、if文にはさらに分岐を追加することができます。さらに分岐を追加したif文は次のように記述します。
ifとelseの間に、「else if」を追加します。これによって、最初の条件式が偽の場合に、次の条件式が評価されます。この「else if」は0個以上記述することができます。
先ほどのプログラムを次のように修正します。
public class CondBranch {
public static void main(String[] args) {
System.out.println("復習します。");
int i = 3;
double d = 2.5;
double ans = (int)d + i * d;
if (ans == 10) {
System.out.println("正解は10です。");
} else if (ans == 9.5) {
System.out.println("正解は9.5です。");
} else {
System.out.println("正解はそれ以外です。");
}
}
}
これによって、ansの値が、10の場合と、9.5の場合と、それ以外の場合で処理を分けることができました。
これを実行してみると、結果として、ansの値は9.5であるということが分かります。
ifのみの構文
最後に、実はif文はelseを省略することもできます。
つまり、if文について正しくは↑のように記述します。
以上のように、if文を使うことで、これまでは単純に上から下に行われていた実行の流れが、条件によっていずれかの「{}」の中を実行するといった流れの分岐が実現されるようになります。
こまけぇハナシ
Javaにはif文の他にも、switch文という条件分岐を実現するための構文があります。まずは、if文を理解できれば十分ですが、余裕があればswitch文も理解しましょう。
switch文
switch文は次のように記述します。
「式の評価結果として得られた値」が、「caseに記述された値」のどれに一致するか判断し、一致するcase部に書かれた文(1行以上)を実行し、breakが来たら、switch文の {} から抜け出します。defaultは、どのcaseにも当てはまらない場合、実行されます。
switch( 式 )の式の評価結果はboolean型の値になる必要はありません。switch文は式の評価結果の値がどのcaseに一致するか判断して分岐する文です。これがif文との違いになります。
すこし複雑な話ですが、switch文の書き方にある「break」文は特別な意図がない限り忘れずに書くようにしましょう。あるcaseの場合、break:が来るまで下に実行され続けます。例えば、下の例では、値1の場合、文Aと文Bを実行することになります。
最後に、if文とswitch文の使い分けですが、多分岐となるような場合(つまり、1つの値に対して複数の場合分けをしたい場合)は、switch文が分かりやすいでしょう。一方で、ある条件が偽の場合に、異なる条件で分岐ーのような、複数の条件を組み合わせる場合は、if文のほうが分かりやすいでしょう。
具体的には、下のif文とswitch文は同じ結果になります。「switch(true)」としているので、「case a > 1」の評価結果がtrueの場合、次に、「b < 2」の評価結果がtrueの場合で実行されます。
switch文は、「括弧の中の値が、この場合だったら...」といった場合で分けられた処理を行うことを目的としたものです。この例では、「caseの式の結果がtrueの場合だったら。」という意味になるので、本来のswitch文の意図に反しており、分かりづらいものになっています。
プログラムは基本的に複数人で開発するものですし、後から自分で読み返すこともあります。したがって、プログラムを書くさいには、それが読み物として理解し易いかどうかといった視点がとても重要となります。
論理演算子
この条件分岐に指定される条件式として、複数の条件の論理積、論理和、否定を表現するために論理演算子が利用されます。論理演算子とは何かについては、以前学習した演算編をご参照ください。
この論理演算子を使って、例えば、年齢が20代かどうかを判定することができます。
if (20 <= age && age < 30) {
System.out.println("20代です。");
}
終わりに
といことで、条件分岐編は以上です。次回は繰り返し編(予定)です。
ほんじゃ、また。
励みになるので、良ければ下の☆ボタン、読者になるボタンを押していって下さい。