2013-10-01 22 views
84

Si prega di spiegare che cosa, esattamente, si verifica quando vengono eseguite le seguenti sezioni di codice:Quali sono le semantiche Java di un numero di escape in un carattere letterale, ad es. ' 15'?

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

Questo stampa 13;

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

stampa 21;

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

Questo stampa 64.

+22

Sembra interpretare il numero come ottale. – Nikhil

+5

'int a = '\ 15'' prima crea un' char' basato sul numero ottale "15" (decimale 13, come carattere, è l'ascii "Carriage Return"), che quindi si ricostituisce in un intero 'int' . Questo è legale dato che i caratteri sono interi a 16 bit, quindi è un upcast sicuro e nessuna informazione sul casting viene emessa da Java. Le altre risposte coprono già tutta la parte ottale/decimale. –

+3

possibile duplicato di [Perché '\ 117' è un carattere letterale valido in Java?] (Http://stackoverflow.com/questions/14950593/why-is-117-a-valid-character-literal-in-java) – gparyani

risposta

115

Hai assegnato un carattere letterale, che è delimitato da virgolette singole, ad esempio 'a' (in quanto distinta da una stringa letterale, che è delimitato da virgolette, ad esempio "a") a una variabile int. Java esegue un cast di ampliamento automatico da 16 bit senza firma char a 32 bit con firma int.

Tuttavia, quando un carattere letterale è una barra rovesciata seguita da 1-3 cifre, è una rappresentazione di octal (base/radix 8) del carattere. Così:

  • \15 = 1 × 8 + 5 = 13 (un ritorno al capo; stessa '\r')
  • \25 = 2 × 8 + 5 = 21 (char NAK - conferma negativa)
  • \100 = 1 × 64 + 0 × 8 + 0 = 64 (il simbolo @, uguale '@')

Per ulteriori informazioni sui valori letterali di carattere e le sequenze di escape, vedere le sezioni JLS:

Citando il BNF da 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

Non riesco a trovarlo nella sezione 3.10.1 .. È in 3.10.4, Letterali caratteri –

+1

La sezione sui valori letterali interi è irrilevante. Vedi [Sezione 3.10.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.4). Vedi anche [Sezione 3.10.6] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html # jls-3.10.6) per le sequenze di escape di caratteri e stringhe. –

+0

'1-3 cifre '- avrebbe dovuto essere' 0-3'. E per ottale a 3 cifre, l'ottale a due cifre può ancora avere "0-7". ex. '\ 77' è ancora valido. – Jayamohan

19

La notazione \nnn indica un codice di carattere ottale in Java. quindi int a = '\15' assegna il valore di cast automatico del carattere ottale 15 a a che è decimale 13.

+5

La notazione '\ nnn' non _non_ denota un numero ottale in Java. Nel codice OP, denota una sequenza di escape di carattere ottale. Le virgolette circostanti sono essenziali. Il personaggio viene quindi allargato a un valore intero dal compito. (I numeri ottali sono indicati da una cifra zero iniziale.) –

+0

Buon punto; dovrebbe aver menzionato l'auto-cast nella risposta. Aggiornata la risposta. –

6

Il fatto che si inseriscano le cifre tra virgolette mi fa sospettare che si stia interpretando il numero come un carattere letterale. Le cifre che seguono devono essere in ottale.