演算子の優先順位
左から順に足していったら、答えが合わない
100 + 200 * 3 を左から順に計算すると 900 ですが、Java が返すのは 700 です。算数と同じで、掛け算と割り算が足し算と引き算より先に計算されるからです。
Java
int a = 100 + 200 * 3; // 700 (200 * 3 が先)
int b = (100 + 200) * 3; // 900 (括弧が先)
int c = 10 - 6 / 2; // 7 (6 / 2 が先)覚えることは多くありません。括弧がいちばん強く、次に * / %、その次に + -、代入の = がいちばん弱い。int x = 100 + 200 * 3; で右側が全部計算し終わってから x に入るのは、= がいちばん弱いからです。
同じ強さの演算子が並んだときは左から順に計算されます。100 / 10 / 2 は (100 / 10) / 2 なので 5 になります。
比較より、&& のほうが後に来る
数の計算だけでなく、条件式にも順番があります。大きな流れは「計算 → 比較 → 論理」です。
Java
boolean ok = score + bonus >= 60 && absent < 5;
// 実際には ((score + bonus) >= 60) && (absent < 5) と読まれるまず足し算が済み、次に >= と < がそれぞれ true か false になり、最後に && がその 2 つを束ねます。だから score + bonus >= 60 と書いても、score + (bonus >= 60) のような妙な読まれ方はしません。この順番のおかげで、条件式は日本語で読んだとおりの意味になります。
迷ったら括弧で囲む
順番を全部覚えるより、括弧を足すほうが早くて確実です。括弧はいちばん強いので、中の式が必ず先に計算されます。しかも括弧を足しても足さなくてもコンパイル後の速さは変わらないので、遠慮する理由がありません。
Java
int total = price + price * rate / 100;
int same = price + ((price * rate) / 100); // 結果は同じ、読みやすさだけ違うsame のように書いておくと、3 か月後の自分が式をたどり直さずに済みます。括弧を足す前と後で結果が変わらないことを実際に確かめられたなら、その式の順番はもう正しく読めているということです。
要件
- クラス名は
Solution、メソッド名はcalcExpression、引数はint a, int b, int cの 3 つ、戻り値の型はintにすること - 計算する式は
a + b * c - (a + b) * c / 2で、優先順位は( )→*/→+-の順、同じ優先順位は左から右に評価する / 2はint同士の割り算なので、小数部分は切り捨てて構わない (キャストしてdoubleにしない)
入出力例
calcExpression(2, 3, 4) → 4
calcExpression(1, 1, 1) → 1
calcExpression(10, 5, 2) → 5
calcExpression(0, 0, 0) → 0
calcExpression(4, 2, 6) → -2
calcExpression(1, 1, 3) → 1ヒント
編集 ゆめさく編集部