¿Cuál es la semántica de Java de un número de escape en un carácter literal, por ejemplo, '\ 15'?

85

Explique qué sucede exactamente cuando se ejecutan las siguientes secciones de código:

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

esto imprime 13;

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

esto imprime 21;

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

esto imprime 64.

VAr
fuente
22
Parece que está interpretando el número como un octal.
Nikhil
5
int a='\15'primero crea un charnúmero octal basado en "15" (decimal 13, como carácter, es el "retorno de carro" ascii), que luego se convierte en un intnúmero entero. Esto es legal ya que los caracteres son enteros de 16 bits, por lo que es un upcast seguro y Java no emite avisos sobre el casting. Las otras respuestas ya cubren todo el asunto octal / decimal.
Mike 'Pomax' Kamermans

Respuestas:

116

Ha asignado un carácter literal, que está delimitado por comillas simples, por ejemplo 'a'(a diferencia de un literal de cadena, que está delimitado por comillas dobles, por ejemplo "a") a una intvariable. Java realiza una conversión de ampliación automática de 16 bits sin firmar chara 32 bits firmados int.

Sin embargo, cuando un carácter literal es una barra invertida seguida de 1 a 3 dígitos, es una representación octal ( base / raíz 8) del carácter. Así:

  • \15= 1 × 8 + 5 = 13 (un retorno de carro; igual que '\r')
  • \25 = 2 × 8 + 5 = 21 (un carácter NAK - reconocimiento negativo)
  • \100= 1 × 64 + 0 × 8 + 0 = 64 (el símbolo @; igual que '@')

Para obtener más información sobre caracteres literales y secuencias de escape, consulte las secciones de JLS:

Citando el BNF de 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
Bohemio
fuente
3
No puedo encontrarlo en la sección 3.10.1 .. Está en 3.10.4, Literales de caracteres
Rafi Kamal
1
La sección sobre literales enteros es irrelevante. Consulte la Sección 3.10.4 . Consulte también la Sección 3.10.6 para conocer las secuencias de escape de caracteres y cadenas.
Ted Hopp
1-3 digits- debería haber sido 0-3. Y es para octal de 3 dígitos, octal de dos dígitos todavía puede tener de 0-7. ex. '\ 77' sigue siendo válido.
Jayamohan
6
@Jayamohan Quise decir 1-3 en cantidad, no en valor
Bohemian
@Bohemio. Buena respuesta. Le sugiero que agregue la sintaxis del literal de escape octal aquí, para que sea más claro. :)
Rohit Jain
19

La notación \nnndenota un código de carácter octal en Java. por lo que int a = '\15'asigna el valor auto-emitido del carácter octal 15 al acual es el decimal 13.

Bahman Movaqar
fuente
5
La notación \nnnno no denotan un número octal en Java. En el código de OP, denota una secuencia de escape de carácter octal. Las comillas circundantes son esenciales. A continuación, la asignación amplía el carácter a un valor entero. (Los números octales se indican con un dígito cero a la izquierda.)
Ted Hopp
Buen punto; debería haber mencionado la transmisión automática en la respuesta. Actualizó la respuesta.
Bahman Movaqar
6

El hecho de que ponga los dígitos entre comillas me hace sospechar que está interpretando el número como un carácter literal. Los dígitos que siguen deben estar en octal.

Nikhil
fuente