다음 코드 섹션이 실행될 때 정확히 어떤 일이 발생하는지 설명하십시오.
int a='\15';
System.out.println(a);
이것은 13을 출력합니다;
int a='\25';
System.out.println(a);
이것은 21을 출력합니다;
int a='\100';
System.out.println(a);
이것은 64를 출력합니다.
다음 코드 섹션이 실행될 때 정확히 어떤 일이 발생하는지 설명하십시오.
int a='\15';
System.out.println(a);
이것은 13을 출력합니다;
int a='\25';
System.out.println(a);
이것은 21을 출력합니다;
int a='\100';
System.out.println(a);
이것은 64를 출력합니다.
int a='\15'
먼저 char
8 진수 "15"(10 진수 13, 문자로 ascii "Carriage Return")를 기반으로 생성 한 다음 int
정수 로 다시 캐스팅합니다 . 문자는 16 비트 정수이므로 이는 합법적이므로 안전한 업 캐스트이며 Java에서 캐스팅에 대한 알림을 발행하지 않습니다. 다른 답변은 이미 전체 8 진수 / 10 진수를 다룹니다.
답변:
예를 들어 '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
1-3 digits
-그래야 했어 0-3
. 그리고 3 자리 8 진수의 경우 2 자리 8 진수는 0-7
. 전의. '\ 77'은 여전히 유효합니다.
표기법 \nnn
은 Java의 8 진 문자 코드를 나타냅니다. 따라서 10 진수 13 int a = '\15'
인 8 진수 15의 자동 캐스팅 된 값을 할당합니다 a
.
\nnn
은 Java에서 8 진수를 나타내지 않습니다 . OP의 코드에서는 8 진 문자 이스케이프 시퀀스를 나타냅니다. 주변 따옴표는 필수입니다. 문자는 할당에 의해 정수 값으로 확장됩니다. (8 진수는 선행 0 자리로 표시됩니다.)