Proszę wyjaśnić, co dokładnie dzieje się, gdy wykonywane są następujące sekcje kodu:
int a='\15';
System.out.println(a);
to wypisuje 13;
int a='\25';
System.out.println(a);
to wypisuje 21;
int a='\100';
System.out.println(a);
to wypisuje 64.
int a='\15'
najpierw tworzy nachar
podstawie liczby ósemkowej „15” (13 dziesiętnie, jako znak, jest to ascii „Powrót karetki”), którą następnie przekształcasz naint
liczbę całkowitą. Jest to legalne, ponieważ znaki są 16-bitowymi liczbami całkowitymi, więc jest to bezpieczna aktualizacja i Java nie wydaje żadnych powiadomień o przesyłaniu. Inne odpowiedzi obejmują już całą rzecz ósemkową / dziesiętną.Odpowiedzi:
Przypisałeś literał znakowy, który jest oddzielony pojedynczymi cudzysłowami, np.
'a'
(W odróżnieniu od literału String, który jest oddzielony podwójnymi cudzysłowami, np."a"
) Doint
zmiennej. Java automatycznie poszerza rzutowanie z 16-bitowego bez znakuchar
do 32-bitowego ze znakiemint
.Jednak gdy literał znakowy jest odwrotnym ukośnikiem, po którym następują 1-3 cyfry, jest to ósemkowa ( podstawa / podstawa 8) reprezentacja znaku. A zatem:
\15
= 1 × 8 + 5 = 13 (powrót karetki; tak samo jak'\r'
)\25
= 2 × 8 + 5 = 21 (znak NAK - negatywne potwierdzenie)\100
= 1 × 64 + 0 × 8 + 0 = 64 (symbol @; to samo co'@'
)Aby uzyskać więcej informacji na temat literałów znaków i sekwencji ucieczki, zobacz sekcje JLS:
Cytując BNF z 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
źródło
1-3 digits
- powinno być0-3
. A jeśli chodzi o 3-cyfrowy ósemkowy, dwucyfrowy ósemkowy nadal może mieć od0-7
. dawny. „\ 77” jest nadal ważny.Notacja
\nnn
oznacza ósemkowy kod znaku w Javie. więcint a = '\15'
przypisuje automatycznie rzucaną wartość znaku ósemkowego 15, doa
którego jest dziesiętnie 13.źródło
\nnn
ma nie oznaczają liczbę ósemkową w Javie. W kodzie OP oznacza ósemkową sekwencję ucieczki znaków. Otaczające cudzysłowy są niezbędne. Znak jest następnie rozszerzany do wartości całkowitej przez przypisanie. (Liczby ósemkowe są oznaczone początkową cyfrą zerową).Fakt, że cyfry umieściłeś w cudzysłowie, każe podejrzewać, że interpretuje to liczbę jako literał znakowy. Kolejne cyfry muszą być zapisane ósemkowo.
źródło