Je ne sais pas s'il y a un élément dans la spécification du langage Java qui dicte le chargement de la valeur précédente d'une variable ...
Il y a. La prochaine fois que vous ne savez pas ce que dit la spécification, veuillez lire la spécification, puis posez la question si elle n'est pas claire.
... le côté droit (x = y)
qui, selon l'ordre indiqué par les parenthèses, doit être calculé en premier.
Cette affirmation est fausse. Les parenthèses n'impliquent pas un ordre d'évaluation . En Java, l'ordre d'évaluation est de gauche à droite, quelles que soient les parenthèses. Les parenthèses déterminent où se trouvent les limites de la sous-expression, et non l'ordre d'évaluation.
Pourquoi la première expression est-elle fausse, mais la seconde est-elle vraie?
La règle pour l' ==
opérateur est: évaluer le côté gauche pour produire une valeur, évaluer le côté droit pour produire une valeur, comparer les valeurs, la comparaison est la valeur de l'expression.
En d'autres termes, la signification de expr1 == expr2
est toujours la même que si vous aviez écrit temp1 = expr1; temp2 = expr2;
puis évalué temp1 == temp2
.
La règle pour l' =
opérateur avec une variable locale sur le côté gauche est: évaluer le côté gauche pour produire une variable, évaluer le côté droit pour produire une valeur, effectuer l'affectation, le résultat est la valeur qui a été affectée.
Alors mettez-le ensemble:
x == (x = y)
Nous avons un opérateur de comparaison. Évaluez le côté gauche pour produire une valeur - nous obtenons la valeur actuelle de x
. Évaluer le côté droit: c'est une affectation, donc nous évaluons le côté gauche pour produire une variable - la variable x
- nous évaluons le côté droit - la valeur actuelle de y
- l'assigner à x
, et le résultat est la valeur assignée. Nous comparons ensuite la valeur d'origine de x
à la valeur qui a été attribuée.
Vous pouvez le faire (x = y) == x
comme un exercice. Encore une fois, rappelez-vous, toutes les règles d'évaluation du côté gauche se produisent avant toutes les règles d'évaluation du côté droit .
Je me serais attendu à ce que (x = y) soit évalué en premier, puis il comparerait x avec lui-même (3) et retournerait vrai.
Votre attente est basée sur un ensemble de croyances incorrectes sur les règles de Java. J'espère que vous avez maintenant des croyances correctes et que vous vous attendez à l'avenir à de vraies choses.
Cette question est différente de "l'ordre d'évaluation des sous-expressions dans une expression Java"
Cette affirmation est fausse. Cette question est tout à fait pertinente.
x n'est certainement pas une «sous-expression» ici.
Cette affirmation est également fausse. Il s'agit d'une sous-expression deux fois dans chaque exemple.
Il doit être chargé pour la comparaison plutôt que d'être «évalué».
Je n'ai aucune idée de ce que cela signifie.
Apparemment, vous avez encore beaucoup de fausses croyances. Mon conseil est que vous lisiez les spécifications jusqu'à ce que vos fausses croyances soient remplacées par de vraies croyances.
La question est spécifique à Java et l'expression x == (x = y), contrairement aux constructions improbables farfelues couramment conçues pour les questions d'entrevue délicates, provient d'un vrai projet.
La provenance de l'expression n'est pas pertinente pour la question. Les règles pour de telles expressions sont clairement décrites dans la spécification; lis le!
Il était censé être un remplacement d'une ligne pour l'idiome de comparaison et de remplacement
Étant donné que ce remplacement sur une ligne a causé beaucoup de confusion en vous, le lecteur du code, je dirais que c'était un mauvais choix. Rendre le code plus concis mais plus difficile à comprendre n'est pas une victoire. Il est peu probable de rendre le code plus rapide.
Soit dit en passant , C # a comparer et remplacer comme méthode de bibliothèque, qui peut être transposée en une instruction machine. Je crois que Java n'a pas une telle méthode, car elle ne peut pas être représentée dans le système de type Java.