リテラル(数値リテラルのアンダースコア区切り)難易度 高無料
次のコードのコンパイル結果として正しいものを選べ。
1 public class Q12 {
2 public static void main(String[] args) {
3 int a = 1_000_000;
4 double d = 3_14.159;
5 long L1 = 9_999_999_999L;
6 float f = 10_00_.5f;
7 System.out.println(a);
8 }
9 }
- Aコンパイルエラー(6行目・アンダースコアが小数点の直前にある)
- Bコンパイルエラー(4行目・小数部の途中にアンダースコアは置けない)
- Cコンパイルエラー(5行目・
Lサフィックスの直前にアンダースコアは置けない) - Dすべての行が正しくコンパイルできる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
数値リテラルには可読性のためにアンダースコア(
各誤答が違う理由_)を桁区切りとして挿入できるが、挿入できる位置には制約がある。
禁止位置は「リテラルの先頭・末尾」「小数点(.)の直前直後」「L・f・d などの型サフィックスの直前」「基数プレフィックス(0x・0b)の直後」。それ以外の数字と数字の間であれば自由に置ける。
- 3行目
1_000_000:数字同士の間のみ。適格。 - 4行目
3_14.159:アンダースコアは3と14の間(数字同士)にあり、小数点には接していない。適格。 - 5行目
9_999_999_999L:どのアンダースコアも数字同士の間で、Lサフィックスの直前は数字(9)。適格。 - 6行目
10_00_.5f:末尾のアンダースコア_が小数点.の直前に置かれている。これは禁止位置でありコンパイルエラーになる。
6行目のみが不正であり、そこでコンパイルが失敗する。
- B4行目のアンダースコアは
3と14という数字同士の間にあり、小数点には接していない。禁止位置に該当せず適格。 - C5行目の
Lの直前は数字9であり、アンダースコアではない。サフィックス直前にアンダースコアがあるわけではないため適格。 - D6行目
10_00_.5fは末尾のアンダースコアが小数点の直前に位置しており、この配置は禁止されているためコンパイルエラーになる。
ひっかけ: 「アンダースコアは数字が並ぶところならどこでも良い」という思い込みが罠。小数点・型サフィックス・基数プレフィックスに隣接する位置だけは禁止されている。5行目の
L の直前は数字なので合法だが、6行目は小数点の直前にアンダースコアがあるため不合法、という違いを見抜く必要がある。コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q12.java:6: error: illegal underscore
float f = 10_00_.5f;
^
→ コンパイル不成立(実行に至らない)。AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)