2012-10-29 16 views
5

W najnowszym wydaniu JavaSpecialists biuletynu, autor wspomina o kawałek kodu, który jest un-compilable w JavieDlaczego niektóre literały znaków powodują błędy składni w Javie?

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

Spróbuj skompilować go, a dostaniesz błąd, takie jak:

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

Dlaczego równoważny fragment kodu C# nie pokazuje takiego problemu?

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

Czy brakuje mi czegoś?

EDYCJA: Moim pierwotnym zamiarem było pytanie, w jaki sposób kompilator C# ma poprawne parsowanie pliku kodu Unicode (jeśli tak) i dlaczego java nadal powinna trzymać się niepoprawnego (jeśli tak) parsowania? EDIT: Również chcę przywrócić tytuł pytania myoriginal? Dlaczego tak ciężka edycja i mocno podejrzewam, że w dużym stopniu zmodyfikowała moje intencje.

+0

Haha. Ty oprócz Javy chcesz się zmienić? Potrzebowałem tego śmiechu :) –

+2

Możesz przywrócić swój oryginalny tytuł (kliknij link "edytowany X czas temu", aby zobaczyć wersje). Jednak oryginalny tytuł był subiektywny i kłótliwy, aby porównać "sposób" Javy i "sposób" C#. Są to różne języki o różnych specyfikacjach. –

+0

@ pst - ale z tym tytułem nie powinienem był zadawać pytań, ponieważ ten sam biuletyn daje wystarczające wyjaśnienie. Szanuję zmiany i nie jestem zmuszony go przywrócić. Moją intencją było, dlaczego różnica w tym kontekście między dwoma podobnymi kompilatorami. – suhair

Odpowiedz

12

Kompilator Javy tłumaczy \uxxxx sekwencje specjalne jako jeden z pierwszych kroków, nawet zanim tokenizer otrzyma pęknięcie kodu. Do momentu, w którym faktycznie zaczyna tokenizować, nie ma już sekwencji \uxxxx; są już zamieniane na znaki, które reprezentują, więc dla kompilatora twój przykład Java wygląda tak samo, jakbyś w pewnym sensie wstawił tam znak powrotu karetki. Robi to, aby zapewnić sposób używania Unicode w źródle, niezależnie od kodowania pliku źródłowego. Nawet tekst ASCII może nadal w pełni reprezentować znaki Unicode, jeśli jest to konieczne (kosztem czytelności), a ponieważ robi się tak wcześnie, możesz mieć je prawie w dowolnym miejscu w kodzie. (Można powiedzieć: \u0063\u006c\u0061\u0073\u0073\u0020\u0053\u0074\u0075\u0066\u0066\u0020\u007b\u007d, a kompilator odczytałby go jako class Stuff {}, jeśli chcesz być denerwujący lub torturować siebie.)

C# nie robi tego. \uxxxx jest tłumaczony później wraz z resztą programu i jest poprawny tylko w niektórych typach tokenów (mianowicie identyfikatorach i ciągach liter/znakach). Oznacza to, że nie można go używać w niektórych miejscach, w których można go używać w Javie. cl\u0061ss nie jest słowem kluczowym, na przykład.

+0

Czy możesz wyjaśnić "później", "niektóre rodzaje tokenów", "określone miejsca"? – Vic

+1

@Vic: "Później" jest tak jasne, jak tylko mogę, a "pewne miejsca" nawet przyniosły przykład. Dodałem wyjaśnienie "niektórych rodzajów tokenów". – cHao

Powiązane problemy