Was ist die Java-Semantik einer maskierten Zahl in einem Zeichenliteral, z. B. '\ 15'?

85

Bitte erläutern Sie, was genau passiert, wenn die folgenden Codeabschnitte ausgeführt werden:

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

dies druckt 13 aus;

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

dies druckt 21 aus;

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

dies druckt 64 aus.

VAr
quelle
22
Sieht so aus, als würde die Zahl als Oktal interpretiert.
Nikhil
5
int a='\15'Erstellt zuerst eine charauf der Oktalzahl basierende Zahl "15" (Dezimalzahl 13, als Zeichen die ASCII "Wagenrücklauf"), die Sie dann in eine intGanzzahl umwandeln. Dies ist legal, da Zeichen 16-Bit-Ganzzahlen sind. Es handelt sich also um einen sicheren Upcast, und Java gibt keine Hinweise zum Casting aus. Die anderen Antworten decken bereits die gesamte Oktal- / Dezimalsache ab.
Mike 'Pomax' Kamermans

Antworten:

116

Sie haben einer Variablen 'a'ein Zeichenliteral zugewiesen, das durch einfache Anführungszeichen begrenzt ist, z. B. (im Gegensatz zu einem String-Literal, das durch doppelte Anführungszeichen begrenzt ist "a") int. Java führt eine automatische Erweiterung von 16-Bit ohne Vorzeichen charauf 32-Bit mit Vorzeichen durch int.

Wenn ein Zeichenliteral jedoch ein Backslash gefolgt von 1-3 Ziffern ist, ist es eine oktale Darstellung ( Basis / Radix 8) des Zeichens. So:

  • \15= 1 × 8 + 5 = 13 (ein Wagenrücklauf; wie '\r')
  • \25 = 2 × 8 + 5 = 21 (eine NAK-Zeichen - negative Bestätigung)
  • \100= 1 × 64 + 0 × 8 + 0 = 64 (das @ -Symbol; wie '@')

Weitere Informationen zu Zeichenliteralen und Escape-Sequenzen finden Sie in den JLS-Abschnitten:

Zitat der BNF aus 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
Böhmisch
quelle
3
Ich kann es nicht in Abschnitt 3.10.1 finden. Es ist in 3.10.4, Character Literals
Rafi Kamal
1
Der Abschnitt über ganzzahlige Literale ist irrelevant. Siehe Abschnitt 3.10.4 . Siehe auch Abschnitt 3.10.6 für Escape-Sequenzen für Zeichen und Zeichenfolgen.
Ted Hopp
1-3 digits- Es hätte sein sollen 0-3. Und es ist für 3-stelliges Oktal, zweistelliges Oktal kann noch von haben 0-7. Ex. '\ 77' ist noch gültig.
Jayamohan
6
@ Jayamohan Ich meinte 1-3 in Menge, nicht Wert
Böhmisch
@Bohemien. Gute Antwort. Ich würde vorschlagen, dass Sie hier die Syntax des oktalen Escape-Literals hinzufügen, damit es klarer wird. :)
Rohit Jain
19

Die Notation \nnnbezeichnet einen oktalen Zeichencode in Java. so int a = '\15'weist den auto-cast'ed Wert von Oktal - Charakter 15 bis adie dezimal 13.

Bahman Movaqar
quelle
5
Die Notation \nnnist nicht eine Oktalzahl in Java bezeichnen. Im OP-Code bezeichnet es eine Escape-Sequenz mit oktalen Zeichen. Die umgebenden Anführungszeichen sind wichtig. Das Zeichen wird dann durch die Zuweisung auf einen ganzzahligen Wert erweitert. (Oktalzahlen werden durch eine führende Nullstelle gekennzeichnet.)
Ted Hopp
Guter Punkt; hätte die automatische Besetzung in der Antwort erwähnen sollen. Die Antwort wurde aktualisiert.
Bahman Movaqar
6

Die Tatsache, dass Sie die Ziffern in Anführungszeichen setzen, lässt mich vermuten, dass die Zahl als Zeichenliteral interpretiert wird. Die folgenden Ziffern müssen oktal sein.

Nikhil
quelle