Що таке семантика 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.