1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Java Silver対策】演算子と型変換の問題集10選

1
Posted at

はじめに

Java Silver(SE 21対応)試験対策として、演算子と型変換に関する問題を10問まとめました。暗黙的型変換やキャスト、==equals()の違いなど、試験頻出のトピックを網羅しています。


問1 ⭐ 整数の除算

次のコードの出力は何ですか?

public class Main {
    public static void main(String[] args) {
        int a = 7;
        int b = 2;
        double result = a / b;
        System.out.println(result);
    }
}

A. 3.5
B. 3.0
C. 3
D. コンパイルエラー

解答と解説

正解: B

a / bint / intなので、整数除算が行われます。結果は3int型)です。その後、double変数に代入される際にintdoubleの拡大変換が起こり、3.0になります。

3.5を得たい場合は、少なくとも一方をdoubleにする必要があります。

double result = (double) a / b; // 3.5

問2 ⭐ 後置・前置インクリメント

次のコードの出力は何ですか?

public class Main {
    public static void main(String[] args) {
        int x = 5;
        int y = x++ + ++x;
        System.out.println("x=" + x + ", y=" + y);
    }
}

A. x=7, y=12
B. x=7, y=11
C. x=6, y=12
D. x=7, y=13

解答と解説

正解: A

処理を順に追います。

  1. x++:式の評価値は5(後置なので現在の値を返す)。その後x6になる
  2. ++xxを先にインクリメント。x7になり、式の評価値は7(前置なので加算後の値を返す)
  3. y = 5 + 7 = 12

結果: x=7, y=12


問3 ⭐⭐ 論理演算子(短絡評価)

次のコードの出力は何ですか?

public class Main {
    public static void main(String[] args) {
        int x = 0;
        boolean result = (x != 0) && (10 / x > 1);
        System.out.println(result);
    }
}

A. false
B. true
C. ArithmeticExceptionが発生
D. コンパイルエラー

解答と解説

正解: A

&&(論理AND)は短絡評価(short-circuit evaluation) を行います。左辺がfalseの場合、右辺は評価されません。

  1. x != 00 != 0false
  2. 左辺がfalseなので、右辺10 / x > 1は評価されない(ゼロ除算は起こらない)
  3. 結果はfalse

もし&(ビットAND/非短絡AND)を使った場合は、右辺も評価されるためArithmeticExceptionが発生します。

boolean result = (x != 0) & (10 / x > 1); // ArithmeticException

問4 ⭐⭐ 暗黙的型変換

次のコードの出力は何ですか?

public class Main {
    public static void main(String[] args) {
        byte b = 10;
        short s = 20;
        var result = b + s;
        System.out.println(((Object) result).getClass().getSimpleName());
    }
}

A. Byte
B. Short
C. Integer
D. Long

解答と解説

正解: C

byteshortの算術演算では、両方のオペランドがint拡大変換(promotion) されてから演算が行われます。結果もint型です。

Javaの算術演算における型の昇格規則:

  1. いずれかのオペランドがdouble→ 他方もdoubleに変換
  2. いずれかがfloat→ 他方もfloatに変換
  3. いずれかがlong→ 他方もlongに変換
  4. それ以外 → 両方intに変換

byte + shortは規則4に該当し、結果はint(ボクシングでInteger)になります。


問5 ⭐⭐ 明示的キャスト

次のコードの出力は何ですか?

public class Main {
    public static void main(String[] args) {
        int i = 300;
        byte b = (byte) i;
        System.out.println(b);
    }
}

A. 300
B. 44
C. -128
D. 0

解答と解説

正解: B

intからbyteへのキャストは縮小変換(narrowing conversion) です。上位ビットが切り捨てられます。

300の2進数表現: 00000000 00000000 00000001 00101100

byteにキャストすると下位8ビット00101100だけが残り、10進数で44です。

縮小変換では、元の値がターゲット型の範囲を超える場合、情報が失われます。コンパイルエラーにはなりませんが、予期しない値になることがあります。


問6 ⭐ ==とequals()(プリミティブ)

次のコードの出力は何ですか?

public class Main {
    public static void main(String[] args) {
        int a = 10;
        double b = 10.0;
        System.out.println(a == b);
    }
}

A. true
B. false
C. コンパイルエラー
D. 実行時エラー

解答と解説

正解: A

プリミティブ型同士の==比較では、型が異なる場合、小さい方の型が大きい方に拡大変換されてから比較されます。

int a = 10doubleに変換されて10.0になり、10.0 == 10.0trueです。

プリミティブ型の==は「値」の比較です。参照型の==は「参照(メモリアドレス)」の比較であることと区別してください。


問7 ⭐⭐ ==とequals()(参照型)

次のコードの出力は何ですか?

public class Main {
    public static void main(String[] args) {
        String s1 = new String("Hello");
        String s2 = new String("Hello");
        String s3 = "Hello";
        String s4 = "Hello";

        System.out.println(s1 == s2);
        System.out.println(s3 == s4);
        System.out.println(s1.equals(s2));
    }
}

A. false, true, true
B. true, true, true
C. false, false, true
D. false, true, false

解答と解説

正解: A

  • s1 == s2new String()で明示的に生成した別オブジェクトなのでfalse
  • s3 == s4 → 文字列リテラルは文字列プールに格納され、同じ内容のリテラルは同じ参照を共有するためtrue
  • s1.equals(s2)equals()は内容(文字列の値)を比較するためtrue

試験では==equals()の違い、文字列プールの仕組みがよく問われます。


問8 ⭐⭐⭐ 複合代入演算子とキャスト

次のコードの出力は何ですか?

public class Main {
    public static void main(String[] args) {
        byte b = 10;
        b += 200;
        System.out.println(b);
    }
}

A. 210
B. -46
C. 0
D. コンパイルエラー

解答と解説

正解: B

複合代入演算子+=には暗黙的なキャストが含まれています。

b += 200;b = (byte)(b + 200);と同等です。

b + 200 = 10 + 200 = 210int型)

210の2進数: 00000000 00000000 00000000 11010010
byteにキャスト(下位8ビット): 11010010(符号付きで**-46**)

b = b + 200;と書いた場合はintbyteに暗黙変換できないためコンパイルエラーになりますが、b += 200;は暗黙キャストが行われるためコンパイルが通ります。これは試験の頻出ポイントです。


問9 ⭐⭐⭐ Integerキャッシュ

次のコードの出力は何ですか?

public class Main {
    public static void main(String[] args) {
        Integer a = 127;
        Integer b = 127;
        Integer c = 128;
        Integer d = 128;

        System.out.println(a == b);
        System.out.println(c == d);
    }
}

A. true, true
B. false, false
C. true, false
D. false, true

解答と解説

正解: C

Integer-128127の範囲でキャッシュを使用します(JLS 5.1.7)。

  • abは値127(キャッシュ範囲内)→ 同じオブジェクトを参照 → a == btrue
  • cdは値128(キャッシュ範囲外)→ 別オブジェクトが生成される → c == dfalse

ラッパー型の比較には必ずequals()を使うべきです。==はオブジェクト参照の比較であり、キャッシュの有無で結果が変わります。


問10 ⭐⭐ 演算子の優先順位

次のコードの出力は何ですか?

public class Main {
    public static void main(String[] args) {
        boolean result = true || false && false;
        System.out.println(result);
    }
}

A. true
B. false
C. コンパイルエラー
D. 実行時エラー

解答と解説

正解: A

演算子の優先順位は && > || です。

したがって、式は以下のように評価されます:

true || (false && false)
= true || false
= true

もし||が先に評価されると(true || false) && false = true && false = falseになりますが、&&の方が優先順位が高いため結果はtrueです。

さらに||は短絡評価を行うため、左辺がtrueの時点で右辺(false && false)は評価されません。


参考


@kotaro_ai_lab
AI活用や開発効率化について発信しています。フォローお気軽にどうぞ!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?