2013-10-01 9 views
84

Proszę wyjaśnić, co właściwie się dzieje, gdy następujące sekcje kodu wykonywane są:Co to jest semantyka języka Java z wartością ewidencjonowaną w literale literału, np. " 15"?

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

ten wypisuje 13;

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

to drukuje 21;

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

ten wypisuje 64.

+22

Wygląda, że ​​interpretuje liczbę jako ósemkową. – Nikhil

+5

'int a = '\ 15'' najpierw tworzy' char' na podstawie liczby ósemkowej "15" (dziesiętnie 13, jako znak char, to ascii "Powrót karetki"), który następnie przekształcasz na 'int' integer . Jest to zgodne z prawdą, ponieważ znaki są 16-bitowymi liczbami całkowitymi, więc jest to bezpieczne uaktualnienie i nie ma informacji o rzutowaniu przez Javę. Pozostałe odpowiedzi obejmują już całą ósemkową/dziesiętną rzecz. –

+3

możliwy duplikat [Dlaczego "\ 117" jest prawidłowym literałem znaków w Javie?] (Http://stackoverflow.com/questions/14950593/why-is-117-a-valid-character-literal-in-java) – gparyani

Odpowiedz

115

został przypisany charakter dosłowne, który jest ograniczony przez apostrofach, np 'a' (w odróżnieniu od String dosłownym, która jest ograniczona przez cudzysłów, np "a") do zmiennej int. Java automatycznie rozszerza rzutowanie z 16-bitowego unsigned char na 32-bitowy podpis int.

Jednak, gdy literał znaku jest odwróconym ukośnikiem, a następnie trzycyfrowym, jest to reprezentacja znaku w postaci octal (base/radix). Zatem:

  • \15 = 1 x 8 + 5 = 13 (znak powrotu karetki, taki sam jak '\r')
  • \25 = 2 x 8 + 5 = 21 (NAK znak - negatywne potwierdzenie)
  • \100 = 1 x 64 + x 8 0 + 0 = 64 (symbol @ takie same znaczenia jak '@')

uzyskać więcej informacji na temat literałach znaków i sekwencje, patrz punkty na trasę:

Cytowanie BNF od 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

Nie mogę znaleźć tego w sekcji 3.10.1. Jest to w 3.10.4, Literały znaków –

+1

Sekcja dotycząca literałów całkowitych nie ma znaczenia. Zobacz [Rozdział 3.10.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.4). Zobacz także [Rozdział 3.10.6] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html # jls-3.10.6) dla sekwencji znaków i łańcuchów znaków. –

+0

"1-3 cyfry" - powinno być "0-3". A jego 3-cyfrowy ósemkowy, dwucyfrowy ósemkowy może nadal mieć od "0-7". dawny. "\ 77" jest nadal prawidłowe. – Jayamohan

19

Zapis \nnn oznacza ósemkowy znakowy kod Java. więc int a = '\15' przypisuje automatycznie wyrenderowaną wartość znaku ósemkowego od 15 do a, która jest dziesiętna 13.

+5

Notacja '\ nnn' ma _not_ oznacza liczbę ósemkową w Javie. W kodzie OP oznacza sekwencję ucieczki w postaci ósemkowej. Okoliczne znaki są niezbędne. Znak zostaje następnie rozszerzony do liczby całkowitej przez zadanie. (Liczby octowe są oznaczone przez wiodącą cyfrę zero.) –

+0

Dobra rada; powinien wspomnieć o automatycznym rzucaniu w odpowiedzi. Zaktualizowano odpowiedź. –

6

Fakt umieszczenia cyfr w cudzysłowach sprawia, że ​​podejrzewam, że interpretuje liczbę jako literał literowy. Cyfry, które następują, muszą być ósemkowe.

Powiązane problemy