Quali sono la semantica Java di un numero con escape in un carattere letterale, ad esempio "\ 15"?


85

Spiega cosa succede esattamente quando vengono eseguite le seguenti sezioni di codice:

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

questo stampa 13;

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

questo stampa 21;

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

questo stampa 64.


22
Sembra che interpreti il ​​numero come ottale.
Nikhil

5
int a='\15'prima crea un charnumero "15" basato sul numero ottale (13 decimale, come un carattere, è l'ascii "Carriage Return"), che poi viene riformulato in un intnumero intero. Questo è legale poiché i caratteri sono numeri interi a 16 bit, quindi è un upcast sicuro e Java non emette avvisi sul casting. Le altre risposte coprono già l'intera cosa ottale / decimale.
Mike 'Pomax' Kamermans

Risposte:


116

Hai assegnato un carattere letterale, che è delimitato da virgolette singole, ad esempio 'a'(come distinto da un valore letterale String, che è delimitato da virgolette doppie, ad esempio "a") a una intvariabile. Java esegue un cast di ampliamento automatico da 16 bit senza segno chara 32 bit con segno int.

Tuttavia, quando un carattere letterale è una barra rovesciata seguita da 1-3 cifre, è una rappresentazione ottale ( base / radice 8) del carattere. Quindi:

  • \15= 1 × 8 + 5 = 13 (un ritorno a capo; uguale a '\r')
  • \25 = 2 × 8 + 5 = 21 (un carattere NAK - riconoscimento negativo)
  • \100= 1 × 64 + 0 × 8 + 0 = 64 (il simbolo @; uguale a '@')

Per ulteriori informazioni sui letterali dei caratteri e sulle 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, Caratteri letterali
Rafi Kamal

1
La sezione sui valori letterali interi è irrilevante. Vedere la sezione 3.10.4 . Vedere anche la Sezione 3.10.6 per le sequenze di escape di caratteri e stringhe.
Ted Hopp

1-3 digits- avrebbe dovuto essere 0-3. Ed è per ottale a 3 cifre, ottale a due cifre può ancora avere da 0-7. ex. "\ 77" è ancora valido.
Jayamohan

6
@Jayamohan Intendevo 1-3 in quantità, non valore
Bohemian

@ Bohemian. Bella risposta. Ti suggerirei di aggiungere la sintassi del letterale di escape ottale qui, quindi sarà più chiaro. :)
Rohit Jain

19

La notazione \nnndenota un codice di caratteri ottale in Java. quindi int a = '\15'assegna il valore auto-cast del carattere ottale 15 al aquale è il decimale 13.


5
La notazione \nnnnon non denota un numero ottale in Java. Nel codice di OP, denota una sequenza di escape di caratteri ottali. Le virgolette circostanti sono essenziali. Il carattere viene quindi ampliato a un valore intero dall'assegnazione. (I numeri ottali sono indicati da una cifra zero iniziale.)
Ted Hopp

Buon punto; avrebbe dovuto menzionare l'auto-cast nella risposta. Aggiornata la risposta.
Bahman Movaqar

6

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.