if文と論理演算子
- 解説
- 1. 条件分岐とif文
- 2. else文
- 3. else-if文
- 4. 並列と入れ子
- 5. 論理演算子
解説
1. 条件分岐とif文
条件分岐とは、既にこれまでの学習でも見てきたように、「もし~ならば」という条件文によってその後の処理を枝分かれさせることです。この枝分かれを実現するのがif文(イフ文)という構文です。「if」は英語で「もしも」のことです。
次のサンプルコードはif文の最も単純な形です。キーワード「if」に続く丸括弧の中がtrueである場合のみ、丸括弧に続くブロックの中身が実行されます。
static void practiceIf() {
if (true) {
Logger.out("ifに続く丸括弧内がtrueだから実行された!");
}
}
丸括弧の中身をfalseに書き換えると、3行目が絶対に実行されないことを示す「dead code」という警告が表示され、コンパイルエラーとなることを確認しておきましょう。
この丸括弧内に論理値型の変数や、論理値型の結果を返す条件式・メソッド呼出を入れることで、その条件に応じて処理を切り替えられます。次のサンプルコードの条件をいろいろ書き換えてみて、ブロック内の実行を制御できることを確認しておきましょう。
static void practiceIf() {
int calculationResult = 1 + 2;
boolean condition = (calculationResult < 4);
if (condition) { // 論理値型の変数を入れた場合
Logger.out("論理値型変数の中身がtrueだから実行された!");
}
if (calculationResult < 4) { // 条件式を直接入れた場合
Logger.out("条件式の評価結果がtrueだから実行された!");
}
if ("a".equals(new String("a"))) { // メソッド呼出を入れた場合
Logger.out("メソッドの戻り値がtrueだから実行された!");
}
}
2. else文
if文では「ある条件を満たす場合に実行する」ブロックを作成することができましたが、「それ以外の場合に実行する」ブロックを作成するには、else文を使用します。
次のサンプルコードのように、if文のブロックに続けてキーワード「else」とブロックを書くことで、if文に続く丸括弧内がfalseだった場合の処理を書くことが可能です。
static void practiceElse() {
boolean condition = false;
if (condition) {
Logger.out("条件はtrue!");
} else {
Logger.out("条件はtrueではない!");
}
}
3. else-if文
分岐させたい条件が複数ある場合には、else-if文を使用することが可能です。
次のサンプルコードのように、if文のブロックに続けてキーワード「else」を書き、さらに、続けてif文を書くことで条件を増やすことができます。このelse-if文はいくつでも繋ぐことが可能ですが、上から順番に丸括弧内の条件式の評価が行われ、trueとなったブロックを実行したらそれ以降を無視して終了(if文・else-if文・else文の次の行に移る)となります。
なお、else文はif文・else-if文全体に対してひとつのみ書くことができ、「どの条件式のブロックにも入らなかった場合」に実行されるブロックとなります。
static void practiceElseIf() {
boolean conditionA = false;
boolean conditionB = true;
boolean conditionC = true;
if (conditionA) {
Logger.out("conditionAがtrueだから実行された!");
} else if (conditionB) {
Logger.out("conditionBがtrueだから実行された!");
} else if (conditionC) {
Logger.out("conditionCがtrueだから実行された!");
} else {
Logger.out("conditionA~Cがすべてfalseだから実行された!");
}
}
[2020/12/31 12:34:56.789] conditionBがtrueだから実行された!
// conditionCもtrueだが、先に7行目が評価され8行目が実行されたためそこで終了
4. 並列と入れ子
前項のサンプルコードのelse-if文をただのif文3つにしてみましょう。
static void practiceFlatten() {
boolean conditionA = false;
boolean conditionB = true;
boolean conditionC = true;
if (conditionA) {
Logger.out("conditionAがtrueだから実行された!");
}
if (conditionB) {
Logger.out("conditionBがtrueだから実行された!");
}
if (conditionC) {
Logger.out("conditionCがtrueだから実行された!");
}
}
すると、今度は12行目も実行されましたね。では次に、else-if文を使わず、else文を使って、前項と同じ処理結果となるように組み直してみます。
static void practiceNest() {
boolean conditionA = false;
boolean conditionB = true;
boolean conditionC = true;
if (conditionA) {
Logger.out("conditionAがtrueだから実行された!");
} else { // conditionAがfalseのためここに入る
if (conditionB) {
Logger.out("conditionBがtrueだから実行された!");
} else { // conditionBがtrueのためここには入らない
if (conditionC) {
Logger.out("conditionCがtrueだから実行された!");
} else {
Logger.out("conditionA-Cがすべてfalseだから実行された!");
}
}
}
}
このようにif文は、並列にするのか、入れ子にするのか、else-if文によって繋げるのかによって、結果も読みやすさも大きく変わりますので、複雑にならないように注意が必要です。
5. 論理演算子
これまでに出てきた条件式には、比較演算式がひとつしかありませんでした。これでは複雑な条件分岐をすべてif文の組み合わせで表現しなくてはなりませんので、比較演算式を組み合わせる方法を学習しましょう。
比較演算式は評価されると結局は論理値となりますので、論理値の状態から新たな論理値の状態を導き出す、論理演算子を使って結果を組み合わせます。
論理演算子 | 用例 | 評価結果 |
---|---|---|
&& | A && B | AとBが両方ともtrueの場合にのみ true A かつ B /論理積/And(アンド)と読む |
|| | A || B | AとBのどちらかがtrueの場合に true A または B /論理和/Or(オア)と読む |
! | !A !(A && B) | trueをfalseに、falseをtrueに反転させる Not(ノット)/論理否定と読む |
実際に必要になるまではピンと来ないと思いますが、次のサンプルコードを確認して、使い方をイメージしておきましょう。
static void practiceComplex() {
String weekday = "火曜";
boolean isHoliday = true;
if (weekday == "土曜" || weekday == "日曜") {
Logger.out("土曜と日曜は22時まで営業!");
} else if (weekday == "火曜" && isHoliday) {
Logger.out("火曜でも祝日は営業!");
} else if (weekday == "火曜" && !isHoliday) {
Logger.out("祝日でない火曜は定休日");
} else {
Logger.out("通常は21時まで営業中!");
}
}
[2020/12/31 12:34:56.789] 火曜でも祝日は営業!
問題
確認問題
確認問題1
次のコードを実行したとき、変数aの値が最終的に2となる
A, B, Cの組み合わせはどれか?
boolean A = ?;
boolean B = ?;
boolean C = ?;
int a = 0;
if (A && B) {
a += 1;
} else if (B && C) {
a += 2;
} else if (!(A || C)) {
a += 3;
} else {
a += 4;
}
Logger.out(a);