「かつ」以外の連結について
値を比較する条件式の作り方とANDつまり「かつ」で二つの条件を連結する方法を見ました。
「変数scoreが30以上80以下」は「変数scoreが30以上」「かつ」「変数scoreが80以下」と書き換えて条件式を作りました。
こんどは「変数scoreが30未満か80を超えるとき」という条件を作りましょう。
30未満 | 30以上80以下 | 80を超える |
---|---|---|
今回の範囲 | 前回の範囲 | 今回の範囲 |
今回この判定は二つの条件「変数scoreが30未満」「変数scoreが80を超える」に分解する事はできますがこの二つを「かつ」でつなぐ事はできません。なぜならある数字が30以上であり同時に80以上であることはありえないからです。
この場合は「または」を使います。「変数scoreが30未満」「または」「変数scoreが80を超える」と言い換えます。「または」は縦線を二つ||と表記します。
「変数scoreが30未満」は score < 30 で、「変数scoreが80を超える」は score > 80 と書くので以下のように分岐をつくることができます。
//sample1 if(score < 30 || score > 80){ System.out.println("I am extraordinary!"); }
この判定は最初の「変数scoreが30未満」が満たされていると判定されると判定は終了しif文に囲まれた処理を行います。満たされない場合は次の条件の判定します。
この「または」による条件をOR条件と呼びます。
条件の否定
ここで今回の条件「変数scoreが30未満か80を超えるとき」は前回の条件「変数scoreが30以上80以下」に含まれないもの全てである事に気付いたでしょうか?
30未満 | 30以上80以下 | 80を超える |
---|---|---|
今回の範囲 | 前回の範囲 | 今回の範囲 |
今回の条件は「前回の条件『変数scoreが30以上80以下』以外のもの」とも言えます。この「以外のもの」という表現を「否定」と言いびっくりマークexclamation mark ! で表現します。AND条件全体を否定するために()で囲んでから否定をしている事に注意してください。
//sample2 if(!(score >= 30 && score <= 80)){ System.out.println("I am extraordinary!"); }
この処理は上のsample1と全く同じ処理になります。またこれと同じ事を以下のように書く事もできます。
//sample3 if(score >= 30 && score <= 80){ }else{ System.out.println("I am extraordinary!"); }
こちらは「以外のもの」というのをif文のelseを利用して表現する方法です。
AND条件とOR条件の併用について
AND条件とOR条件は複数並べてかくことができます。
if(condition_a && condition_b && condition_c){ System.out.println("I am qualified all of them"); }
if(condition_a || condition_b || condition_c){ System.out.println("I am qualified one of them"); }
しかしANDとORを同時に使うとどうなるでしょう?
if(condition_a || condition_b && condition_c){ System.out.println("I am qualified"); }
ANDとORではANDの方がさきに判定されます。掛け算と足し算が混ざった式では掛け算が先に計算されるのと同じです。
このため上の条件は「条件Aまたは『条件Bかつ条件C』のどちらか」という判定になります。もし「条件Aまたは条件B」を先に評価してほしい場合「『条件Aまたは条件Bのどちらか』かつ条件C」と表現したい場合は以下のように()でOR条件を囲います。
if((condition_a || condition_b) && condition_c){ System.out.println("I am qualified"); }
とはいえ条件式は()でいくら囲んでも問題ないのでまよったら優先する条件をかこんでおくというのも安全策としては有効です。