Що таке семантика Java екранованого числа в символі-літералі, наприклад '\ 15'?


85

Будь ласка, поясніть, що саме відбувається, коли виконуються такі розділи коду:

int a='\15';
System.out.println(a);

це роздруковує 13;

int a='\25';
System.out.println(a);

це роздруковує 21;

int a='\100';
System.out.println(a);

це роздруковує 64.


22
Схоже, це інтерпретація числа як вісімки.
Nikhil

5
int a='\15'спочатку створюється на charоснові вісімкового числа "15" (десятковий знак 13, як символ, це ascii "Поворот каретки"), який потім ви перетворюєте на intціле число. Це законно, оскільки символи є 16-бітовими цілими числами, тому це безпечне оновлення, і Java не видає жодних повідомлень про кастинг. Інші відповіді охоплюють цілу вісімкову / десяткову річ.
Mike 'Pomax' Kamermans

Відповіді:


116

Ви призначили символьний літерал, який розмежовується одинарними лапками, наприклад 'a'(на відміну від літерального рядка, який розмежовується подвійними лапками, наприклад "a") intзмінній. Java виконує автоматичне розширення з 16-розрядного беззнакового charдо 32-розрядного підписаного int.

Однак, коли літеральний символ є зворотною косою рисою, за якою слідують 1-3 цифри, це вісімкове ( база / радіус 8) подання символу. Отже:

  • \15= 1 × 8 + 5 = 13 (повернення каретки; те саме, що '\r')
  • \25 = 2 × 8 + 5 = 21 (символ NAK - негативне підтвердження)
  • \100= 1 × 64 + 0 × 8 + 0 = 64 (символ @; такий самий, як '@')

Для отримання додаткової інформації про символьні літерали та екранні послідовності див. Розділи JLS:

Цитуючи BNF з 3.10.6:

OctalEscape:
    \ OctalDigit
    \ OctalDigit OctalDigit
    \ ZeroToThree OctalDigit OctalDigit

OctalDigit: one of
    0 1 2 3 4 5 6 7

ZeroToThree: one of
    0 1 2 3

3
Я не можу знайти його в розділі 3.10.1 .. Це в 3.10.4, Персональні літерали
Рафі Камал

1
Розділ про цілочисельні літерали не має значення. Див. Розділ 3.10.4 . Також див. Розділ 3.10.6 щодо послідовностей екранування символів та рядків.
Тед Хопп,

1-3 digits- це мало бути 0-3. І це для 3-значного восьмеричного числа, двозначне восьмеричне число все ще може мати від 0-7. напр. '\ 77' все ще діє.
Джаямохан

6
@Jayamohan Я мав на увазі 1-3 за кількістю, а не за вартістю
Bohemian

@Bohemian. Приємна відповідь. Я б запропонував додати сюди синтаксис восьмеричного літералу втечі, щоб він був більш зрозумілим. :)
Rohit Jain

19

Позначення \nnnпозначає вісімковий код символу в Java. таким чином int a = '\15'призначає значення автоматичного приведення восьмеричного символу 15, aякому дорівнює десятковий знак 13.


5
Позначення \nnnзовсім НЕ означає вісімкове число в Java. У коді OP він позначає восьмеричну послідовність екрану символів. Навколишні лапки мають важливе значення. Потім за призначенням символ розширюється до цілого числа. (Вісімкові числа позначаються провідною нульовою цифрою.)
Тед Хопп,

Гарна думка; повинен був згадати про автоматичну передачу у відповіді. Відповідь оновлено.
Bahman Movaqar

6

Той факт, що ви ставите цифри в лапки, змушує мене підозрювати, що це трактує число як символьний літерал. Цифри, що слідують, мають бути восьмеричними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.