演算子と分岐文の要点
内容の確認日: 2026-10-03
この分野は、コードを 1 行ずつ追って「何が出力されるか」を答える問題が中心です。演算子の細かいルール (整数同士の割り算、++ の前置と後置、&& の短絡評価など) を 1 つでも取り違えると答えがずれるので、暗記より「手で計算して確かめる」練習が効きます。
出題項目は「各種演算子の使用」「演算子の優先順位」「if, if/else 文の使用」「switch 文の使用」の 4 つです。特に問われやすいのは、各種演算子と switch 文のフォールスルーです。
算術演算子: 整数の除算と剰余
int 同士の割り算 / は、結果も int になり、小数点以下は切り捨て (0 の方向へ丸める) られます。どちらかが double なら結果も double です。剰余 % の結果の符号は、割られる数 (左側) の符号と同じになります。
public class Main { public static void main(String[] args) { System.out.println(7 / 2); System.out.println(7 % 2); System.out.println(7 / 2.0); System.out.println(-7 % 2); }}java Main 3 1 3.5 -1
整数を 0 で割ると実行時に ArithmeticException が発生します。一方、double を 0 で割っても例外にはならず、結果は Infinity (無限大) になります。
byte や short 同士の計算結果は、int に広げられてから計算されるため int 型になります。そのため byte の変数に計算結果をそのまま代入するとコンパイルエラーです。ただし += などの複合代入演算子は、自動的に元の型へ戻してくれるのでエラーになりません。
public class Main { public static void main(String[] args) { byte b = 10; b = b + 1; b += 1; System.out.println(b); }}javac Main.java
コンパイルエラー (4 行目): b + 1 は int 型なので、キャストしないと byte に代入できない (5 行目の b += 1 は問題ない)
インクリメントとデクリメント
++ (1 増やす) と -- (1 減らす) は、変数の前に書くか後ろに書くかで、式の中で使われる値が変わります。
・前置 ++a: 先に a を増やし、増やした後の値を式に使う
・後置 a++: 増やす前の値を式に使い、その後で a を増やす
public class Main { public static void main(String[] args) { int a = 5; int b = a++ + 10; System.out.println(a + " " + b); int c = 5; int d = ++c + 10; System.out.println(c + " " + d); }}java Main 6 15 6 16
どちらの場合も、最後に変数自身が 1 増えている点は同じです。違うのは「式の中で使われた値」だけです。
比較演算子と論理演算子
比較演算子 (==、!=、<、>= など) の結果は boolean です。論理演算子は、&& (かつ)、|| (または)、! (否定) が基本です。
&& と || は短絡評価をします。&& は左側が false なら、|| は左側が true なら、その時点で結果が決まるので右側を実行しません。一方、& と | は左側の結果にかかわらず右側も必ず実行します。次のコードでは、&& の行は右側の 10 / n が実行されないので例外になりませんが、& の行では実行されて例外が発生します。
public class Main { public static void main(String[] args) { int n = 0; System.out.println((n != 0) && (10 / n > 1)); System.out.println((n != 0) & (10 / n > 1)); }}java Main false
実行時に例外が発生: ArithmeticException
文字列を == で比較すると、中身ではなく「同じオブジェクトか」を比べます。中身が同じかどうかは equals メソッドで比べます。
public class Main { public static void main(String[] args) { String a = "Java"; String b = new String("Java"); System.out.println(a == b); System.out.println(a.equals(b)); }}java Main false true
文字列の連結と演算子の優先順位
+ は、どちらかが文字列なら文字列の連結になります。+ は左から順に計算されるので、文字列が出てくる前の数値は足し算され、文字列が出てきた後は連結になります。
public class Main { public static void main(String[] args) { System.out.println("合計: " + 1 + 2); System.out.println(1 + 2 + "円"); System.out.println("合計: " + (1 + 2)); }}java Main 合計: 12 3円 合計: 3
主な演算子の優先順位は、高いものから次の順です。同じ優先順位の演算子は、代入演算子を除いて左から計算します。迷ったら ( ) を付けて考えましょう。
1. 後置の ++ --
2. 前置の ++ --、単項の + -、!、キャスト
3. * / %
4. + -
5. < > <= >=
6. == !=
7. & → ^ → |
8. &&
9. ||
10. 三項演算子 ? :
11. 代入 = += など (右から計算)
x *= 3 + 2 のような複合代入は、右辺全体を先に計算するので x = x * (3 + 2) と同じ意味になります。x = x * 3 + 2 ではない点に注意してください。
if 文と三項演算子
if の条件には boolean の式しか書けません。if (x = 5) は比較 (==) ではなく代入で、式の値が int になるためコンパイルエラーです。
{ } を省略した if は、直後の 1 文だけが条件の対象になります。インデント (字下げ) は意味を持たないので、見た目にだまされないようにしましょう。次のコードでは、2 つ目の println は if の外にあるので、条件が false でも実行されます。
public class Main { public static void main(String[] args) { int score = 40; if (score >= 60) System.out.println("合格"); System.out.println("おめでとう"); }}java Main おめでとう
if ~ else if ~ else は上から順に条件を調べ、最初に条件を満たしたブロックだけを実行します。後ろの条件も満たしていても、実行されるのは 1 つだけです。
三項演算子 条件 ? 値1 : 値2 は、条件が true なら値1、false なら値2 になる式です。入れ子にした場合は、右側から組み立てて読むと分かりやすくなります。
switch 文
switch 文は、式の値と一致する case から実行を始めます。break がないと、次の case の処理も続けて実行されます (フォールスルー)。どの case にも一致しないときは default から実行します。default は途中に書いても構いません。
public class Main { public static void main(String[] args) { String level = "B"; switch (level) { case "A": System.out.println("優"); case "B": System.out.println("良"); case "C": System.out.println("可"); break; default: System.out.println("不可"); } }}java Main 良 可
switch の式に使える型は、byte・short・char・int とそのラッパークラス、String、列挙型です。long・float・double・boolean は使えません。また、case に書く値は定数でなければならず、同じ値の case を 2 つ書くとコンパイルエラーです。
public class Main { public static void main(String[] args) { int n = 1; switch (n) { case 1: System.out.println("one"); break; case 1: System.out.println("first"); } }}javac Main.java
コンパイルエラー (8 行目): case 1 が重複している
String の switch は equals と同じく中身で比較され、大文字と小文字は区別されます。
試験でよくある引っかけ
int同士の割り算5 / 2は2です。小数が欲しいときは、どちらかをdoubleにします (5 / 2.0は2.5)。剰余の符号
-7 % 3は-1です。結果の符号は割られる数 (左側) と同じになります。後置インクリメントの値
b = a++では、bには増やす前の値が入ります。a自身は増えています。&&と&の違い&&は左側がfalseなら右側を実行しません。右側に++や割り算がある問題では、実行されたかどうかで答えが変わります。{ }のないifとインデント{ }を省略したifの対象は直後の 1 文だけです。字下げされていても 2 文目はifの外です。switchのbreak忘れbreakがないcaseは、次のcaseの処理まで続けて実行されます。一致したcaseから下を順に追いましょう。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- Oracle University 日本「1Z0-818-JPN (Java SE Bronze) 試験」
- Java 言語仕様 (Java SE 11) 15「Expressions」
- Java 言語仕様 (Java SE 11) 14.11「The switch Statement」
- The Java Tutorials「Operators」
コード例は、試験の対象バージョンで実際にコンパイル・実行して結果を確認しています。