Non sono sicuro se nella specifica del linguaggio Java sia presente un elemento che impone il caricamento del valore precedente di una variabile ...
C'è. La prossima volta che non si sa bene cosa dice la specifica, si prega di leggere la specifica e quindi porre la domanda se non è chiara.
... il lato destro (x = y)
che, per ordine implicito tra parentesi, dovrebbe essere calcolato per primo.
Questa affermazione è falsa. Le parentesi non implicano un ordine di valutazione . In Java, l'ordine di valutazione è da sinistra a destra, indipendentemente dalle parentesi. Le parentesi determinano dove si trovano i limiti della sottoespressione, non l'ordine di valutazione.
Perché la prima espressione viene valutata come falsa, ma la seconda viene valutata come vera?
La regola per l' ==
operatore è: valutare il lato sinistro per produrre un valore, valutare il lato destro per produrre un valore, confrontare i valori, il confronto è il valore dell'espressione.
In altre parole, il significato di expr1 == expr2
è sempre lo stesso di se tu avessi scritto temp1 = expr1; temp2 = expr2;
e valutato temp1 == temp2
.
La regola per l' =
operatore con una variabile locale sul lato sinistro è: valutare il lato sinistro per produrre una variabile, valutare il lato destro per produrre un valore, eseguire l'assegnazione, il risultato è il valore assegnato.
Quindi mettilo insieme:
x == (x = y)
Abbiamo un operatore di confronto. Valuta il lato sinistro per produrre un valore: otteniamo il valore corrente di x
. Valuta il lato destro: questo è un compito, quindi valutiamo il lato sinistro per produrre una variabile - la variabile x
- valutiamo il lato destro - il valore corrente di y
- assegnalo a x
, e il risultato è il valore assegnato. Confrontiamo quindi il valore originale di x
con il valore assegnato.
Puoi fare (x = y) == x
come esercizio. Ancora una volta, ricorda, tutte le regole per valutare il lato sinistro si verificano prima di tutte le regole per valutare il lato destro .
Mi sarei aspettato di valutare prima (x = y), quindi avrebbe confrontato x con se stesso (3) e sarebbe tornato vero.
Le tue aspettative si basano su una serie di credenze errate sulle regole di Java. Spero che ora tu abbia credenze corrette e in futuro ti aspetteresti cose vere.
Questa domanda è diversa da "ordine di valutazione delle sottoespressioni in un'espressione Java"
Questa affermazione è falsa. Questa domanda è totalmente germana.
x non è sicuramente una "sottoespressione" qui.
Anche questa affermazione è falsa. È una sottoespressione due volte in ogni esempio.
Deve essere caricato per il confronto piuttosto che essere "valutato".
Non ho idea di cosa significhi.
Apparentemente hai ancora molte false credenze. Il mio consiglio è di leggere le specifiche fino a quando le vostre false credenze vengono sostituite da vere credenze.
La domanda è specifica di Java e l'espressione x == (x = y), a differenza dei costrutti impraticabili di vasta portata comunemente realizzati per le domande difficili dell'intervista, proveniva da un vero progetto.
La provenienza dell'espressione non è rilevante per la domanda. Le regole per tali espressioni sono chiaramente descritte nelle specifiche; leggilo!
Doveva essere una sostituzione di una riga per il linguaggio di confronto e sostituzione
Dal momento che la sostituzione di una riga ha causato molta confusione in te, lettore del codice, suggerirei che è stata una scelta sbagliata. Rendere il codice più conciso ma più difficile da capire non è una vittoria. È improbabile che il codice sia più veloce.
Per inciso, C # ha confrontato e sostituito come metodo di libreria, che può essere ridotto a un'istruzione macchina. Credo che Java non abbia un tale metodo, in quanto non può essere rappresentato nel sistema di tipo Java.