2012-10-29 18 views
5

, yazarNeden bazı karakter değişmezleri Java'da Sözdizimi Hataları'na neden oluyor? JavaSpecialists bültenin son sayısında

public class A1 { 
    Character aChar = '\u000d'; 
} 

derlemek deneyin Java un-derlenebilir olan kod parçası bahseder ve aşağıda belirtilenler gibi bir hata alırsınız:

A1.java:2: illegal line end in character literal 
       Character aChar = '\u000d'; 
           ^

Neden C# eşdeğer bir parça böyle bir sorun göstermiyor?

public class CharacterFixture 
{ 
    char aChar = '\u000d'; 
} 

Hiçbir şey eksik miyim?

DÜZENLEME: Asıl amacım, C# derleyici unicode dosyası ayrıştırma düzeltmesi (eğer öyleyse) ve neden java hala yanlış (eğer öyleyse) ayrıştırma yapmalıydı? DÜZENLEME: Ayrıca geri yüklenecek menijinalı soru başlığı istiyorum? Neden bu kadar ağır bir düzenleme ve niyetimi ağır bir şekilde değiştirdiğinden şüpheleniyorum.

+0

Haha. Java'nın değişmesi dışında mı? Bu güce ihtiyacım vardı :) –

+2

Orijinal başlığınızı geri yükleyebilirsiniz (revizyonları görmek için “düzenlenmiş X zaman önce” linkini tıklayınız). Ancak, orijinal başlık, Java'nın "yolunu" ve C# "yolunu" karşılaştırmak için öznel ve tartışmacıydı. Farklı özelliklere sahip farklı dillerdir. –

+0

@pst - ama bu başlık ile, aynı haber bülteni yeterince açıklama verdiği için soruyu sormamalıydım. Düzenlemelere saygı duyuyorum ve geri yüklemeye zorlamıyorum. Niyetim, bu bağlamdaki iki benzer derleyici arasındaki farkın nedeniydi. – suhair

cevap

12

Java'nın derleyicisi, kod çözücünün kodda bir çatlak oluşturmadan önce bile, ilk adımlardan biri olan \uxxxx kaçış dizilerini çevirir. Gerçekten de jetonlaşmaya başladığında, artık \uxxxx dizisi yoktur; onlar zaten temsil ettikleri karakterlere çevrilmişlerdir, bu yüzden derleyiciniz için Java örneğiniz yazıyormuş gibi görünmektedir. Kaynak dosyanın kodlamasına bakılmaksızın, kaynak içinde Unicode kullanmanın bir yolunu sağlamak için bunu yapar. ASCII metni bile, gerekirse (okunabilirlik pahasına) Unicode karakterlerini tam olarak temsil edebilir ve çok erken yapıldığından, kodda hemen hemen her yerde olabilirsiniz. (\u0063\u006c\u0061\u0073\u0073\u0020\u0053\u0074\u0075\u0066\u0066\u0020\u007b\u007d diyebiliriz ve derleyici, kendinizi sinir bozucu veya işkence olmak istiyorsanız class Stuff {} olarak okuyabilir.)

C# bunu yapmaz. \uxxxx daha sonra programın geri kalanıyla çevrilir ve yalnızca belirli tipte tokenlerde (yani, tanımlayıcılar ve dize/karakter değişmezleri) geçerlidir. Bu, Java'da kullanılabileceği belirli yerlerde kullanılamayacağı anlamına gelir. Örneğin, cl\u0061ss bir anahtar kelime değildir.

+0

"Sonra", "bazı belirteçleri", "belirli yerler" hakkında ayrıntılı bilgi verir misiniz? – Vic

+1

@Vic: "Daha sonra" bunu yapabildiğim kadar net ve "belli yerler" bile bir örnekle geldi. "Belirli belirteçleri" için açıklama ekledim. – cHao

İlgili konular