Nie jestem pewien, czy istnieje specyfikacja języka Java, która nakazuje ładowanie poprzedniej wartości zmiennej ...
Jest. Następnym razem, gdy nie będziesz wiedział, co mówi specyfikacja, przeczytaj specyfikację, a następnie zadaj pytanie, czy jest niejasne.
... prawa strona, (x = y)
która według kolejności podanej w nawiasach powinna być obliczona jako pierwsza.
To stwierdzenie jest fałszywe. Nawiasy nie oznaczają kolejności oceny . W Javie kolejność oceny jest od lewej do prawej, niezależnie od nawiasów. Nawiasy określają, gdzie znajdują się granice podwyrażeń, a nie kolejność oceny.
Dlaczego pierwsze wyrażenie jest fałszywe, a drugie prawdziwe?
Reguła dla ==
operatora to: oceń lewą stronę, aby wygenerować wartość, oceń prawą stronę, aby wygenerować wartość, porównaj wartości, porównanie jest wartością wyrażenia.
Innymi słowy, znaczenie expr1 == expr2
jest zawsze takie samo, jak gdybyś napisał, temp1 = expr1; temp2 = expr2;
a następnie ocenił temp1 == temp2
.
Reguła dla =
operatora z lokalną zmienną po lewej stronie: oszacuj lewą stronę, aby wygenerować zmienną, oceń prawą stronę, aby wygenerować wartość, wykonaj przypisanie, wynikiem jest wartość, która została przypisana.
Więc złóż to razem:
x == (x = y)
Mamy operatora porównania. Oszacuj lewą stronę, aby uzyskać wartość - otrzymamy bieżącą wartość x
. Oceń prawą stronę: jest to przypisanie, więc oceniamy lewą stronę, aby utworzyć zmienną - zmienną x
- oceniamy prawą stronę - bieżącą wartość y
- przypisujemy ją x
, a wynikiem jest przypisana wartość. Następnie porównujemy oryginalną wartość z x
wartością, która została przypisana.
Możesz to zrobić (x = y) == x
jako ćwiczenie. Ponownie pamiętajcie, że wszystkie zasady oceny lewej strony mają miejsce przed wszystkimi zasadami oceny prawej strony .
Spodziewałbym się najpierw (x = y), a następnie porównałby x z samym sobą (3) i zwrócił true.
Twoje oczekiwania oparte są na zestawie niepoprawnych przekonań na temat reguł Java. Mam nadzieję, że masz teraz prawidłowe przekonania i w przyszłości będziesz oczekiwać prawdziwych rzeczy.
To pytanie różni się od „kolejności oceny podwyrażeń w wyrażeniu Java”
To stwierdzenie jest fałszywe. To pytanie jest całkowicie niemądre.
x zdecydowanie nie jest tutaj „podwyrażeniem”.
To stwierdzenie jest również fałszywe. Jest to podwyrażenie dwa razy w każdym przykładzie.
Należy go załadować do porównania, a nie „ocenić”.
Nie mam pojęcia, co to znaczy.
Najwyraźniej nadal masz wiele fałszywych przekonań. Moja rada jest taka, że czytasz specyfikację, dopóki twoje fałszywe przekonania nie zostaną zastąpione prawdziwymi przekonaniami.
Pytanie jest specyficzne dla Javy, a wyrażenie x == (x = y), w odróżnieniu od dalekosiężnych niepraktycznych konstrukcji powszechnie tworzonych na trudne pytania podczas wywiadu, pochodzi z prawdziwego projektu.
Pochodzenie tego wyrażenia nie ma znaczenia dla pytania. Zasady dotyczące takich wyrażeń są jasno opisane w specyfikacji; Przeczytaj to!
Miał to być jednowierszowy zamiennik idiomu „porównaj i zamień”
Ponieważ to zastąpienie jednego wiersza spowodowało w tobie wiele zamieszania, czytelniku kodu, sugerowałbym, że był to zły wybór. Uczynienie kodu bardziej zwięzłym, ale trudniejszym do zrozumienia, nie jest wygraną. Jest mało prawdopodobne, aby kod był szybszy.
Nawiasem mówiąc, C # ma porównywać i zamieniać jako metodę biblioteczną, którą można przypisać do instrukcji maszyny. Wierzę, że Java nie ma takiej metody, ponieważ nie może być reprezentowana w systemie typów Java.