JavaSE7以降から数値リテラル内に可読性向上のためアンダースコア( _ )が使えるようになったようです。
初心者的には以前は使えなかったことすら知らなかったことですし、そんな膨大な値を使う機会もないですがカンマの代わり(例:1,000 → 1_000)や数字と数字の間のスペースの代わり(例:0120 333 333 → 0120_333_333)として使うことを想定しているようです。
Java SE 8 認定資格を目指す身としては勉強しておいて損はなさそうですし、どのようにアンダースコアを使用するのか勉強もかねて調べてみました。
※console.logでアンダースコアの数値を呼び出すとアンダースコアは消えているので、あくまでプログラミング時の見やすさのようです。
※リテラル(literal)とはソースコードに記述されている変数に代入される値などのことです。
※動作確認はEclipse2019-03 で行っています。
リテラル内アンダースコアの使用ルール
アンダースコアを置ける場所は桁の間だけです。簡単にいえば数字と数字の間です。
細かくルールを見ていきましょう。
数値の先頭または末尾にアンダースコアは置けない
先頭と末尾は数字と数字の間に挟めないのでアンダースコアは置けません。
int a = _123; //NG
int b = 123_; //NG
int c =1_2_3; //OK
※Oracleのページを読むと、下記のような記述がしてあって太文字にもなっていないし、OKともInvalidとも書かれていないので大混乱しました。
int x1 = _52;
// This is an identifier, not a numeric literal
(訳:これは数値リテラルではなく識別子です)
初心者的にはどういう説明かよくわかりませんが(いつかわかるといいな)、とりあえずEclipseやpaizaで見てもエラーになるりますし、先頭のアンダースコアは置けないのでNGということでしょう。
アンダースコアは連続してもいい
アンダースコアは連続して置くことも、複数置くことも可能です。
long a = 123_456__789___10_______________________1L; // OK
小数点の隣には置けない
小数点は記号なので数字と数字で挟めないため、前後にはアンダースコアは置けません。
double a = 1._23; // NG
double b = 1_.23; // NG
double c = 1.123_456; // OK
F(Float)またはL(Long)接尾辞の前
接尾辞ももちろん数字ではないので前にアンダースコアは置けません。
float a = 1.23_F; // NG
long b = 123_456_789_L; // NG
数字の文字列が想定されている場所
なんだそれ?って感じですね。
調べてみたところおそらく文字の時には使えないということのようです。
例えばUnicodeの間は数字と数字の間ですが使えないということだと思われます。
char a = ‘\u30_42’; // NG
char a = ‘\u3042’; //OK
参考サイト: Java 7 underscore in numeric literals
その他
進数の接頭辞の場合
こちらも数字と数字の間にのみアンダースコアを置くことができます。
// 2進数
int a = 0b_101; // NG
int b = 0b1_01; // OK 結果は5
//8進数
int c = 0_123; // OK 結果は83
//16進数
int c = 0x_1b3; // NG
int d = 0x1b_3; // OK 結果は435
8進数は接頭辞の後もOKなのでなんだか不思議な気持ちになります。
そして16進数も英字だけれども数値なのでOKというちょっとしたトラップです。
アンダースコアが使われている場合の計算は?
ちょっとした疑問です、アンダースコアが使われている場合の計算は問題なくできるのでしょうか。
多分できるでしょうけど。せっかくなので試してみました。
int a = 0x1b_3; //435
int b = 1_2; //12
System.out.println(a+b); //447
問題なく行えました。
以上アンダースコアまとめでした。
参考サイト:数値リテラル内のアンダースコア | Oracle
参考サイト:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html