今回やること
演算子は、値を計算したり比べたりする記号です。商品の小計を計算し、「5,000円以上または会員なら送料無料」という判定を作ります。
前提: Java入門 #3 - 変数とデータ型を終え、
intとbooleanの変数を使えること。
よく使う演算子
算術演算子
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
+ | 足す | 8 + 3 | 11 |
- | 引く | 8 - 3 | 5 |
* | 掛ける | 8 * 3 | 24 |
/ | 割る | 8 / 3 | 2 |
% | 余り | 8 % 3 | 2 |
整数同士の8 / 3は、小数部分を切り捨てて2になります。小数の結果が必要なら、少なくとも片方をdoubleにします。
比較演算子
| 演算子 | 意味 | 例 |
|---|---|---|
== | 等しい | total == 5000 |
!= | 等しくない | total != 0 |
> / >= | より大きい / 以上 | total >= 5000 |
< / <= | より小さい / 以下 | total < 5000 |
比較結果はtrueまたはfalseです。代入の=と、等しいか比べる==を区別してください。
論理演算子
| 演算子 | 意味 | trueになる例 |
|---|---|---|
&& | 両方とも | age >= 13 && age <= 18 |
| ` | ` | |
! | 反対にする | !isClosed |
&&と||は次の表で確認できます。
| A | B | A && B | A || B |
| --- | --- | --- | --- |
| true | true | true | true |
| true | false | false | true |
| false | true | false | true |
| false | false | false | false |
&&は両方を満たす必要があり、||は少なくとも一方を満たせばよい、と日本語へ戻して確認します。
代入演算子
points += 10はpoints = points + 10の短い書き方です。-=, *=, /=も同じ考え方です。
判定コードを段階的に作る
最初に単価と個数から小計を計算します。
int unitPrice = 1200;
int quantity = 3;
int subtotal = unitPrice * quantity;
次に比較と論理演算子を使います。
boolean isMember = true;
boolean freeShipping = subtotal >= 5000 || isMember;
小計は3,600円なので最初の比較はfalseですが、会員がtrueのため、false || trueの結果はtrueです。
| 式 | 結果 |
|---|---|
subtotal >= 5000 | 3600 >= 5000なのでfalse |
isMember | 設定した値がtrue |
| `false |
長い条件式は、このように小さな比較へ分けて読むと間違いを見つけやすくなります。
完成コードを動かす
OperatorDemo.javaとして保存します。
public class OperatorDemo {
public static void main(String[] args) {
int unitPrice = 1200;
int quantity = 3;
int subtotal = unitPrice * quantity;
boolean isMember = true;
boolean freeShipping = subtotal >= 5000 || isMember;
int points = 20;
points += quantity * 10;
System.out.println("小計: " + subtotal + "円");
System.out.println("送料無料: " + freeShipping);
System.out.println("ポイント: " + points);
}
}
javac OperatorDemo.java
java OperatorDemo
成功確認
小計: 3600円
送料無料: true
ポイント: 50
isMemberをfalseに変えると、送料無料がfalseになることも確認してください。小計を5,000円以上へ変えた場合は、非会員でもtrueになります。
次の3通りを試すと、境界と論理演算子を確認できます。
| 小計 | 会員 | 送料無料 |
|---|---|---|
| 3,600円 | false | false |
| 3,600円 | true | true |
| 6,000円 | false | true |
優先順位と括弧
*は+より先、&&は||より先に評価されます。暗記だけに頼らず、まとまりを括弧で示すと読みやすくなります。
boolean canEnter = hasTicket && (isStudent || isMember);
Javaの&&と||は、左側だけで結果が決まる時に右側を評価しません。例えばuser != null && user.isActive()は、userがnullなら右側を呼びません。この性質を短絡評価と呼びます。まずは左から安全に判定できる順番を意識してください。
よくあるつまずき
=と==を混同する
=は右の値を左へ代入し、==は左右が等しいか比較します。
Stringを==で比べる
文字列の内容はname.equals("Ada")で比べます。==はStringの内容比較には使いません。
&&と||の条件を逆にする
「両方必要」なら&&、「どちらかでよい」なら||です。条件を日本語で一度書いてから式へ変えます。
練習
映画館の割引判定を作ってください。「年齢が18歳以下、または学生なら割引」とします。ageとisStudentからhasDiscountを計算し、条件を変えてtrueとfalseの両方を確認します。
次のステップ
Java入門 #5 - Stringの基本で、文字列の結合・長さ・内容比較を学びます。