前回boolean変数によってif文を作りました。ここでは変数ではなく判定による真偽を使って分岐するようにします。
たとえば「二つの値が同じ」とか「片方の値が大きい」などのの判定結果でもよいのです。値の大小が想定通りであるか判定する事によってbooleanの値を返すものを条件式と言います。
条件は英語でconditionといいます。con-はラテン語の「一緒に」という意味で英語のwithに相当します。ditionはラテン語の「言う」に由来していて「言うこと」に関係する言葉です。「一緒に」というのは「どこの人でもどんな人でも一緒に」という意味でこの場合「常に」という意味にもなります。conditionとはある事に対して同じ意見を言う」という意味です。
定数の英語constantもconを使っています。この場合は「一緒に立つもの」という意味で「常に同じ状態でいるもの」を指します。
シンプルな条件式
ある変数、int型の変数が10であるか判定します。
if(am_i_ten == 10){ System.out.println("I am 10!"); }
同じであることを判定する条件式を作るには=を二つ連結したものを二つの値の間に置きます。変数でも実際の値をでもよいですが、両方とも値をそのまま書くのは分岐を書く意味がないです。10 == 10は必ずtrueになるため実行する前からどっちになるかわかっているからです。
以下条件式をつくるための演算子の一覧です
記号 | 意味 | 例 | 例がtrueになる条件 |
---|---|---|---|
== | 両方の値が等しいか | a == 10 | 変数aが10であるとき |
> | 左が右より大きいか | a > 10 | 変数aが10より大きいとき |
< | 左が右より小さいか | a < 10 | 変数aが10より小さいとき |
>= | 左が右より大きいまたは等しいか | a >= 10 | 変数aが10またはそれより大きいとき |
<= | 左が右より小さいまたは等しいか | a <= 10 | 変数aが10またはそれより小さいとき |
!= | 両方の値が等しくないか | a != 10 | 変数aが10以外のとき |
二つの条件式を連結する
たとえば「変数scoreが30以上80以下」という条件式はどのように作るのでしょうか?「以上」は「等しいか大きい」という意味で、「以下」は「等しいか小さい」という意味です。
if(30 <= score <= 80){...}
とは書けません。条件演算子は二つの値を比べる事はできますが三つ並べる事はできません。この場合は条件を二つに分けます。
- 条件A:変数scoreが30以上
- 条件B:変数scoreが80以下
そして「条件Aを満たしかつ条件Bを満たす」という表現をします。この「かつ」に相当する演算子は && というものです。二つの&です。
条件Aは score >= 30 で、条件Bは score <= 80 と書くので
if(score >= 30 && score <= 80){ System.out.println("I am not bad!"); }
となります。両方の条件を満たさなくてはいけないので最初の条件「変数scoreが30以上」が満たさないとその先は判定はせずにfalseであると判断します。もし満たした場合は次の条件「変数scoreが80以下」を判定し、これが満たされると半てされると初めてif文の中の処理が実行されます。
この「かつ」による条件をAND条件といいます。
演算子を参照の注意
==を使う場合は参照型の変数、つまりオブジェクトの変数にも使えます。しかしオブジェクト同士の値を比べて判定するわけではありません。オブジェクトメモリ上に書き込まれているオブジェクトの場所を変数として持っているので==でオブジェクトを使うとオブジェクトが同じかではなく「オブジェクトの置いてある場所が同じか」を比べる事になります。仮に同じ値のオブジェクト同士であっても別の場所に記憶されているのであれば場所が違うので==でtrueは帰りません。この場合はオブジェクトの持つメソッドequalsやcompareToというものを使うのですがこれは別の機会に説明します。
今のところは参照型の変数の比較に==を使うのは避けた方がいい事だけ注意してください。