選択構造(分岐構造とも呼ばれます)は、逐次構造の判断ができないという欠点を解決し、条件に応じてどのステートメントブロックを実行するかを判断することができます。選択構造は、論理比較や関係比較などの条件判断を伴う計算に適しています。たとえば、仕事を辞める時間かどうかを判断したり、2 つの数字の大きさを判断したりするなどです。
スペースが限られているため、このセクションでは主に if ステートメントのさまざまな形式と使用法を紹介します。 switch ステートメントの使用法については、「 Java switch の場合」セクションで説明します。
構造体の場合
if ステートメントは、選択ステートメントに属する最もよく使用される条件分岐構造であり、条件ステートメントとも呼ばれます。
if 選択構造は、条件に従って判断され、処理される文法構造です。デフォルトでは、if ステートメントはそのすぐ下のステートメントの実行を制御します。ただし、ステートメント ブロックを使用すると、if ステートメントで複数のステートメントを制御できます。
if ステートメントの最も単純な文法形式は次のとおりです。これは、「特定の条件が満たされた場合に何らかの処理を実行する」という意味です。
if (condition) {
//statement;
}
その中でも「条件式」と「ステートメントブロック」の2つは重要な箇所です。
condition
: 条件式には任意の種類の論理式を使用でき、最後に返される結果はブール値である必要があります。値は、純粋なブール変数または定数、または関係演算子またはブール演算子を使用した式にすることができます。条件が true の場合、ステートメント ブロックは実行されます。条件が false の場合、ステートメント ブロックはバイパスされ、実行されません。- statement: ステートメント ブロックは、1 つのステートメントまたは複数のステートメントにすることができます。ステートメントが 1 つだけの場合、条件ステートメントの中括弧 {} は省略できます。中括弧を省略するとプログラムが読みにくくなりますので、プログラミング仕様の観点から中括弧は省略しないでください。
例1
ユーザーがキーボードから数値を入力し、その数値が 100 より大きいかどうかを判断できる Java プログラムを作成します。 if 文を使用した実装コードは次のとおりです。
public static void main(String[] args) {
System.out.println("数字を入力してください:");
Scanner input = new Scanner(System.in);
int num = input.nextInt(); // キーボードからデータを受信
// ユーザーが入力したデータが100より大きいかどうか判断する
if (num > 100) {
System.out.println("入力した数字は100より大きいです");
}
// ユーザーが入力したデータが100と等しいかどうか判断する
if (num == 100) {
System.out.println("入力した数字は100と等しいです");
}
// ユーザーが入力したデータが100より小さいかどうか判断する
if (num < 100) {
System.out.println("入力した数字は100より小さいです");
}
}
例 2
値がそれぞれ 50 と 34 である 2 つの変数 num1 と num2 があるとします。 if文を用いてnum1とnum2の大小関係を判定し、比較結果を出力する以下のプログラムを作成してください。
実装コードは次のとおりです。
public static void main(String[] args) {
int num1 = 50;
int num2 = 34;
if (num1 > num2) {
System.out.println("num1がnum2より大きいです");
}
if (num1 == num2) {
System.out.println("num1がnum2と等しいです");
}
if (num1 < num2) {
System.out.println("num1がnum2より小さいです");
}
}
この選択文は、num1 の値と num2 の値の間の大小関係を判定します。ここでは num1 が 50、num2 が 34 であるため、実行後は「num1 は num2 より大きい」と出力されます。
例 3
上記の 2 つの case コードでは、各 if ステートメントにはステートメント ブロック内にステートメントが 1 つしか含まれていないため、中かっこは省略されています。この例では、ログイン システムのユーザー名、パスワード、確認コードが正しい必要があります。正しくないと、ログイン失敗とエラー プロンプトが表示されます。ステートメント ブロックには複数のステートメントがあるため、中括弧が必要です。コードは以下のように表示されます:
public static void main(String[] args) {
String username = "admin"; // ユーザー名
String userpass = "123456"; // パスワード
String code = "0001"; // 認証コード
if (username != "admin" && userpass != "123456" && code != "0000") {
System.out.println("ログイン失敗!");
System.out.println("入力されたユーザー名、パスワード、認証コードを確認してください。");
}
}
ここでは、ログイン条件を検証するための if ステートメントに複雑な複合式が設定されています。実行後の出力は次のようになります。
ログイン失敗!
入力されたユーザー名、パスワード、認証コードを確認してください。
if-else 構造
単一の if ステートメントは、条件が満たされた場合にのみ使用でき、それ以外のことはできません (停止)。 if 文と else 文を組み合わせると 2 つの操作を定義できますが、このときの if…else 文は「条件が true の場合は 1 つの操作を実行し、そうでない場合はもう 1 つの操作を実行する」という意味になります。
if…else ステートメントを使用するための構文は次のとおりです。
もし(式) {
ステートメントブロック1;
} else {
ステートメントブロック2;
}
上記の文法形式では、if キーワードの後の式が true の場合はステートメント ブロック 1 が実行され、そうでない場合はステートメント ブロック 2 が実行されます。
例 4
例 3 では、num1 と num2 の大きさを比較するために、3 つの if 条件文を使用して、以上、等しい、未満の状況を判断します。以下では、if…else double 条件を使用して実現します。具体的なコードは次のとおりです。
public static void main(String[] args) {
int num1 = 50;
int num2 = 34;
// num1がnum2と等しい場合
if (num1 == num2) {
System.out.println("num1はnum2と等しいです");
}
// num1がnum2よりも大きい場合
if (num1 > num2) {
System.out.println("num1はnum2よりも大きいです");
} else {
// そうでなければ、num1はnum2よりも小さい
System.out.println("num1はnum2よりも小さいです");
}
}
二重条件ステートメントにより、プログラムの可読性が向上しながら、記述されるコードの量が削減されます。単純化された結果は同じであり、実行後は「num1 は num2 より大きい」と出力されます。
複数の条件付き if-else-if ステートメント
if ステートメントの主な機能は、プログラムに分岐を提供することです。ただし、プログラム内にもう 1 つのブランチがあるだけでは不十分な場合や、プログラムのブランチが非常に複雑になる場合があり、その場合は複数ブランチの if…else if ステートメントの使用が必要になります。
通常、「ある条件が満たされていれば、ある処理を実行し、そうでなければ、別の条件が満たされていれば、別の処理を実行し…、これらの条件が満たされない場合は、最後の条件を実行する」と表現されます。
if…else if 複数分岐ステートメントの文法形式は次のとおりです。
if(条件1) {
処理1;
} else if(条件2) {
処理2;
...
} else if(条件n) {
処理n;
} else {
処理n+1;
}
else-if 構造は、実際には if-else 構造のマルチレベルの入れ子であることがわかります。明らかな特徴は、複数の分岐において 1 つの文グループのみが実行され、他の分岐は実行されないことです。この構造は、複数の判定結果を持つ分岐でも使用できます。
if…else if文を使用すると、式の値が順番に判定され、ある分岐の条件式の値が真の場合、その分岐に対応する文ブロックが実行され、分岐の外にジャンプします。 if ステートメント全体を使用してプログラムの実行を続行します。すべての式が false の場合、ステートメント ブロック n+1 を実行し、引き続き後続のプログラムを実行します。
例5
また、num1 と num2 のサイズの比較を例として、複数の条件で if…else if を使用する実装コードは次のとおりです。
public static void main(String[] args) {
int num1 = 50;
int num2 = 34;
if (num1 == num2) { // If num1 is equal to num2
System.out.println("num1はnum2に等しいです");
} else if (num1 > num2) { // If num1 is greater than num2
System.out.println("num1はnum2より大きいです");
} else { // Otherwise, it's less than
System.out.println("num1はnum2より小さいです");
}
}
上記のコードに示すように、num1 と num2 は if ステートメントの「num1==num2」条件を満たしていないため、else if の「num1>num2」条件をテストし、条件を満たし、「num1はnum2より大きいです
」と出力します。
例6
学校の成績の判断基準を、90点以上で「優秀」、90点未満で80点以上で「良好」、「不良」と評価できるとします。
public static void main(String[] args) {
System.out.println("試験の成績を入力してください:");
Scanner input = new Scanner(System.in);
int score = input.nextInt(); // キーボードからの入力受け取り
if (score >= 90) { // 試験成績>=90
System.out.println("優秀");
} else if (score >= 80) { // 90>試験成績>=80
System.out.println("良好");
} else if (score >= 60) { // 80>試験成績>=60
System.out.println("中等");
} else { // 試験成績<60
System.out.println("不可");
}
}
テストスコアが 90 点以上の場合は最初の if 文を実行し、次の 3 つの条件判定文は実行されません; テストスコアが 80 点以上 90 点未満の場合は最初の else if 文が実行されます。テストのスコアが 60 ~ 80 点で、60 点を含む場合は、2 番目の else if ステートメントを実行します。上記の 3 つの条件のいずれも満たされない場合は、else ステートメントを実行します。
if ステートメントの使用法は非常に柔軟で、単独で使用できるだけでなく、if ステートメント内に別の if ステートメントをネストすることもできます。同様に、if…else ステートメントと if…else if ステートメントを別の if 構造ステートメントにネストして、より深い判断を行うこともできます。
ネストされた if の構文は次のとおりです。
if(条件式1) {
if(条件式2) {
実行ブロック1;
} else {
実行ブロック2;
}
} else {
if(条件式3) {
実行ブロック3;
} else if(条件式4) {
実行ブロック4;
} else {
if(条件式n) {
実行ブロックn;
} else {
実行ブロックn+1;
}
}
}
上記の形式では、各 else はそれに最も近い if と一致し、他に対応する else がないことに注意してください。
例 7
今日が勤務日であれば仕事に行き、週末であれば遊びに行き、同時に週末の天気が晴れていれば屋外の遊び場に行き、晴れていなければ屋外の遊び場に行きます。室内遊び場へ。実装コードは次のとおりです。
public static void main(String[] args) {
String today = "週末";
String weather = "晴れ";
if (today.equals("週末")) {
if (weather.equals("晴れ")) {
System.out.println("屋外の遊園地に遊びに行く");
} else {
System.out.println("室内の遊園地に遊びに行く");
}
} else {
System.out.println("仕事に行く");
}
}