Bir karakter değişmezinde kaçan bir sayının Java semantiği nedir, örneğin '\ 15'?


85

Lütfen aşağıdaki kod bölümleri yürütüldüğünde tam olarak ne olduğunu açıklayın:

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

bu 13 yazdırır;

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

bu 21 yazdırır;

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

bu 64 çıktı.


22
Görünüşe göre sayıyı sekizlik olarak yorumluyor.
Nikhil

5
int a='\15'ilk önce charsekizlik sayıya dayalı bir "15" (ondalık 13, karakter olarak, ascii "Carriage Return") oluşturur ve bunu daha sonra bir inttamsayıya dönüştürürsünüz. Karakterler 16 bitlik tam sayılar olduğu için bu yasaldır, bu nedenle güvenli bir yayındır ve Java tarafından döküm hakkında herhangi bir bildirim yayınlanmaz. Diğer cevaplar sekizlik / ondalık sayının tamamını kapsıyor.
Mike 'Pomax' Kamermans

Yanıtlar:


116

Bir değişkene, tek tırnakla ayrılmış bir karakter değişmezi atadınız, örneğin 'a'(çift tırnak ile ayrılmış bir String değişmezinden farklı olarak "a") int. Java, 16-bit işaretsizden char32-bit imzalıya otomatik bir genişleme çevirimi yapar int.

Bununla birlikte, bir karakter değişmezi bir ters eğik çizgi ve ardından 1-3 basamak olduğunda, karakterin sekizlik ( taban / taban 8) temsilidir. Böylece:

  • \15= 1 × 8 + 5 = 13 (bir satırbaşı; aynı '\r')
  • \25 = 2 × 8 + 5 = 21 (bir NAK karakteri - negatif alındı)
  • \100= 1 × 64 + 0 × 8 + 0 = 64 (@ sembolü; ile aynı '@')

Karakter değişmezleri ve kaçış dizileri hakkında daha fazla bilgi için JLS bölümlerine bakın:

BNF'nin 3.10.6'dan alıntılanması:

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
3.10.1 bölümünde bulamıyorum .. 3.10.4'te, Character Literals
Rafi Kamal

1
Tamsayı değişmezleri ile ilgili bölüm alakasızdır. Bölüm 3.10.4'e bakın . Ayrıca karakter ve dize kaçış dizileri için Bölüm 3.10.6'ya bakın .
Ted Hopp

1-3 digits- olmalıydı 0-3. Ve onun 3 basamaklı sekizlik için, iki basamaklı sekizlik yine de olabilir 0-7. ör. '\ 77' hala geçerli.
Jayamohan

6
@Jayamohan Ben 1 - 3'ü kastetmiştim, değer değil
Bohemian

@Bohem. Güzel cevap. Buraya sekizlik kaçış sözdizimini eklemenizi öneririm, böylece daha net olacaktır. :)
Rohit Jain

19

Gösterim \nnn, Java'da sekizlik bir karakter kodunu belirtir. bu nedenle , ondalık 13 olan int a = '\15'sekizlik karakter 15'in otomatik çevrilmiş değerini atar a.


5
Notasyonu \nnnyok değil Java Sekizlik bir sayıyı belirtir. OP'nin kodunda, sekizlik karakter kaçış dizisini belirtir. Çevreleyen tırnak işaretleri önemlidir. Karakter daha sonra atama ile bir tamsayı değerine genişletilir. (Sekizli sayılar baştaki sıfır hanesi ile gösterilir.)
Ted Hopp

İyi bir nokta; cevapta otomatik yayınlamadan bahsetmeliydim. Cevap güncellendi.
Bahman Movaqar

6

Rakamları tırnak içine koymanız, sayıyı bir karakter harfi olarak yorumladığından şüphelenmeme neden oluyor. Takip eden rakamlar sekizlik olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.