条件演算子(三項演算子 ?: の二項数値昇格)難易度 高無料
次のコードの出力として正しいものを選べ。
1 public class Q8 {
2 public static void main(String[] args) {
3 int x = 5;
4 System.out.println(true ? x : 3.0);
5 }
6 }
- A
5.0 - B
5 - Cコンパイルエラー(
?:の第2・第3オペランドの型が異なる) - D
3.0
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
条件演算子 ? : の結果の型は、条件が実際に true/false のどちらであったかとは無関係に、第2・第3オペランドの型から静的に決まる(JLS §15.25)。
第2オペランドが int(x)、第3オペランドが double(3.0)で、両者が数値型かつ定数の特別扱い(byteへの収まり等)に該当しない場合、二項数値昇格(binary numeric promotion)が適用され、式全体の型はより広い double に統一される。
したがって、条件が true で選ばれるのは x の枝でも、評価結果は int の 5 のままではなく、double に昇格された 5.0 になる。println(double) は 5.0 と表示する。
- B条件が
trueでx側が選ばれても、式全体の型は第2・第3オペランドの型(intとdouble)から静的に決まり、doubleに統一される。よって5ではなく5.0。 - C
intとdoubleはともに数値型で二項数値昇格の対象になるため、型が異なっていてもコンパイルは通る(結果型はdouble)。 - D条件は
trueなので選ばれるのはx側の枝であり、3.0(選ばれなかった枝の値)が出力されることはない。
ひっかけ: 「条件が
true なら x(int)がそのまま返る」と考えて 5 だと誤答しやすい。実際は選ばれなかった枝の型も含めて式全体の型が決まるため、int と double が混在すると選ばれた枝の値も double に昇格される。これは Silver 試験の頻出の落とし穴。コマンド例と想定される挙動(未実行)
出力: 5.0
公式ドキュメント・関連JLS SE11 §15.25 Conditional Operator ? :↗
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)