Подчеркивание между цифрами

Неправильно добавлен символ подчеркивания, как показано ниже:

int i = 1_5;

Но не ошибка компиляции. Почему так? Выход идет так, как если подчеркивание игнорируется. Тогда почему такая функция в Java?

Ответы

Ответ 1

См. Подчеркивает числовые литералы:

В Java SE 7 и более поздних версиях любое количество символов подчеркивания (_) может появляются где-нибудь между цифрами в числовом литерале. Эта особенность позволяет вам, например, разделять группы цифр в числовом литералы, которые могут улучшить читаемость вашего кода.

Вы не дали хорошего примера, так как 15 читается даже без разделения цифр на 1_5. Но возьмите, например, номер: 100000000000, трудно сказать, что это такое, не считая цифр, так что вы можете сделать:

100_000_000_000

что облегчает идентификацию числа.

В вашем примере попробуйте:

int i = 1_5;
System.out.println(i); //Prints 15

Ответ 2

Это новая функция, действительная с Java 7. Она улучшает читаемость ваших литеральных значений.

В соответствии с Малой Гуптой OCA_Java_SE_7_Programmer_I_Certification_Guide_Exam_1Z0-803:

Обратите внимание на использование символов подчеркивания в числовом литеральном значении. Вот некоторые из правила:

1) Вы не можете начинать или заканчивать буквенное значение с помощью подчеркивания.

2) Вы не можете выделить подчеркивание сразу после префиксов 0b, 0B, 0x, и 0X, которые используются для определения двоичного и шестнадцатеричного литералов значения.

3) Вы можете поместить нижнее подчеркивание справа после префикса 0, который используется для определения восьмеричного литерального значения.

4) Вы не можете помещать знак подчеркивания до суффикса L (суффикс L используется для обозначения буквального значения как можно дольше).

5) Вы не можете использовать подчеркивание в позициях, где строка цифр ожидается.

Действительные примеры:

long baseDecimal = 100_267_760;
long octVal = 04_13;
long hexVal = 0x10_BA_75;
long binVal = 0b1_0000_10_11;

Недопустимые примеры:

int intLiteral = _100;
int intLiteral2 = 100_999_;
long longLiteral = 100_L;