Proste wyrażenie jakW jaki sposób kompilator Java analizuje typecasts?
(x) - y
jest interpretowane różnie w zależności od tego, czy x
jest nazwą typu, czy nie. Jeśli x
nie jest nazwą typu, (x) - y
odejmuje tylko y
od x
. Ale jeśli x
jest nazwą typu, (x) - y
oblicza wartość ujemną z y
i rzuca otrzymaną wartość na typ x
.
W typowym kompilatorze C lub C++ pytanie, czy x
jest typem, czy też nie, jest odpowiedzialne, ponieważ parser przekazuje takie informacje do leksera, gdy tylko przetworzy deklarację typedef lub struct. (Myślę, że takie wymagane naruszenie poziomów było najprzykrzejszą częścią projektu C.)
Ale w Javie x
może nie zostać zdefiniowany później w kodzie źródłowym. W jaki sposób kompilator Java rozróżnia takie wyrażenie?
Jest oczywiste, że kompilator Java wymaga wielu przejść, ponieważ Java nie wymaga deklaracji przed użyciem. Ale to wydaje się sugerować, że pierwsze przejście musi wykonać bardzo niechlujne zadanie podczas analizowania wyrażeń, a następnie w późniejszym przejściu wykonać kolejną, dokładniejszą analizę składni wyrażeń. To wydaje się marnotrawstwem.
Czy istnieje lepszy sposób?
Byłem zbyt leniwy, aby sprawdzić specyfikację (i nie wiedziałem, gdzie i tak spojrzeć). +1 –
Rozważ zaakceptowanie tej odpowiedzi. –