Java の演算子の優先順位と結合規則
分かりづらい計算の「順番」をハッキリさせるのが、優先順位と結合規則。ここを押さえるだけで、結果が思った通りに出るようになります。迷ったら括弧で「意図」を見える化するのが合言葉。
演算子の優先順位
複数の演算が混ざったとき、どれを先に計算するかのルールです。算数と同じく、掛け算・割り算が足し算・引き算より先に計算されます。
- 基本ルール: 掛け算・割り算・余り → 足し算・引き算 → 代入
- よく出る優先度の並び:
- 高:
*,/,% - 中:
+,- - 低:
=
- 高:
例1:優先順位で結果が変わる
int result = 10 + 5 * 4; // 10 + (5 * 4) = 10 + 20 = 30
Java- ポイント:
*が+より先。見た目に惑わされない。
例2:括弧で意図を変える
int result = (10 + 5) * 4; // (10 + 5) = 15 → 15 * 4 = 60
Java- ポイント: 括弧は最優先。読みやすさもアップ。
結合規則(同じ優先度の並び順)
同じ種類の演算子が続いたとき、「左から」か「右から」かを決めるルールです。
- 左結合: 左から順に計算(
+,-,*,/,%, ほとんどがこれ) - 右結合: 右から順に計算(
=や複合代入+=など)
例3:左結合のイメージ
int result = 20 - 5 - 3; // (20 - 5) = 15 → 15 - 3 = 12
Java- ポイント: 右からやると 20 – (5 – 3) = 18。全然違う。
例4:代入は右結合
int a, b, c;
a = b = c = 5; // c に 5、b に c、a に b → 全部 5
Java- ポイント: 右から順に値が渡ってくる。
よくあるつまずきポイント
- 整数同士の割り算は小数切り捨て:
5 / 2は2。小数が欲しいなら、どちらかをdoubleに。 %は余り:7 % 3は1。偶数判定はn % 2 == 0。++と--の位置で意味が変わる: 前置はすぐ反映、後置は「使った後で」変わる。+は文字列連結にも使われる: 数値計算と混ざるときは括弧で明確に。
例5:整数割り算と型
double x = 5 / 2; // 2 → 2.0 に変換される(意図せず小数落ちる)
double y = 5.0 / 2; // 2.5(片方が double なら小数に)
double z = (double)5 / 2; // 2.5(キャストでもOK)
Java例6:インクリメントの前置・後置
int n = 10;
int a = ++n; // 前置:nが11になってからaに代入 → a=11, n=11
int b = n++; // 後置:先に代入してからnが+1 → b=11, n=12
Java例7:文字列連結の落とし穴
System.out.println("合計: " + 2 + 3); // 合計: 23(順番に連結)
System.out.println("合計: " + (2 + 3)); // 合計: 5(括弧で計算を先に)
Java練習問題(手で答えを書いてからコードで確認)
問題1:結果は?
- 式:
10 + 2 * 3 - 4 - ヒント: 掛け算が先。その後、左から。
解答例:
int result = 10 + 2 * 3 - 4; // 10 + 6 - 4 = 12
Java問題2:括弧で変わる?
- 式A:
8 - 3 - 2 - 式B:
8 - (3 - 2)
解答例:
int a = 8 - 3 - 2; // (8 - 3) - 2 = 3
int b = 8 - (3 - 2); // 8 - 1 = 7
Java問題3:整数割り算の注意
- 式:
7 / 2 + 1.0
解答例:
double v = 7 / 2 + 1.0; // 3 + 1.0 = 4.0(7/2 は 3)
double w = 7 / 2.0 + 1.0; // 3.5 + 1.0 = 4.5(片方が小数)
Java問題4:++ の位置
- 開始:
int x = 5; - 式:
int y = x++ + ++x;
解答例:
int x = 5;
int y = x++ + ++x;
// ステップ: x++ → yに5を使い、その後x=6
// 次の ++x → xが7になってから使う
// y = 5 + 7 = 12, 最終的に x = 7
Java安全に書くコツ
- 括弧で意図を明示: 読み手と未来の自分へのメモ。
- 型を意識する: 整数か小数かで結果が変わる。
- 長い式は分ける: 一行で頑張らない。中間変数で読みやすく。
例:分けて安全に
int base = 10;
int bonus = 5 * 4; // 20
int total = base + bonus; // 30
System.out.println(total);
Java