문자 리터럴에서 이스케이프 된 숫자의 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
숫자를 8 진수로 해석하는 것 같습니다.
Nikhil

5
int a='\15'먼저 char8 진수 "15"(10 진수 13, 문자로 ascii "Carriage Return")를 기반으로 생성 한 다음 int정수 로 다시 캐스팅합니다 . 문자는 16 비트 정수이므로 이는 합법적이므로 안전한 업 캐스트이며 Java에서 캐스팅에 대한 알림을 발행하지 않습니다. 다른 답변은 이미 전체 8 진수 / 10 진수를 다룹니다.
Mike 'Pomax'Kamermans

답변:


116

예를 들어 'a'(큰 따옴표로 구분되는 문자열 리터럴과 구별되는 것과 같이 "a") int변수 에 작은 따옴표로 구분되는 문자 리터럴을 할당했습니다 . Java는 부호없는 16 비트에서 부호 char있는 32 비트로 자동 확장 캐스트를 수행합니다 int.

그러나 문자 리터럴이 백 슬래시 뒤에 1-3 자리 숫자가있는 경우 문자의 8 진수 ( 기본 / 기수 8) 표현입니다. 그러므로:

  • \15= 1 × 8 + 5 = 13 (캐리지 리턴,과 동일 '\r')
  • \25 = 2 × 8 + 5 = 21 (NAK 문자-부정적 승인)
  • \100= 1 × 64 + 0 × 8 + 0 = 64 (@ 기호,와 동일 '@')

문자 리터럴 및 이스케이프 시퀀스에 대한 자세한 내용은 JLS 섹션을 참조하세요.

3.10.6 에서 BNF 를 인용하면 :

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에 있습니다. Character Literals
Rafi Kamal

1
정수 리터럴에 대한 섹션은 관련이 없습니다. 3.10.4 절을 참조하십시오 . 문자 및 문자열 이스케이프 시퀀스에 대해서는 3.10.6 절을 참조하십시오 .
Ted Hopp

1-3 digits-그래야 했어 0-3. 그리고 3 자리 8 진수의 경우 2 자리 8 진수는 0-7. 전의. '\ 77'은 여전히 ​​유효합니다.
Jayamohan

6
@Jayamohan 나는 가치가 아니라 수량에서 1-3을 의미했습니다
보헤미안

@보헤미아 사람. 좋은 대답입니다. 여기에 8 진수 이스케이프 리터럴의 구문을 추가하는 것이 좋습니다. :)
Rohit Jain

19

표기법 \nnn은 Java의 8 진 문자 코드를 나타냅니다. 따라서 10 진수 13 int a = '\15'인 8 진수 15의 자동 캐스팅 된 값을 할당합니다 a.


5
표기법 \nnn은 Java에서 8 진수를 나타내지 않습니다 . OP의 코드에서는 8 진 문자 이스케이프 시퀀스를 나타냅니다. 주변 따옴표는 필수입니다. 문자는 할당에 의해 정수 값으로 확장됩니다. (8 진수는 선행 0 자리로 표시됩니다.)
Ted Hopp 2013 년

좋은 지적; 대답에서 자동 캐스트를 언급 했어야했습니다. 답변을 업데이트했습니다.
Bahman Movaqar

6

숫자를 따옴표로 묶었다는 사실은 숫자를 문자 리터럴로 해석하는 것 같습니다. 뒤에 오는 숫자는 8 진수 여야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.