Si short
est automatiquement promu int
dans les opérations arithmétiques, alors pourquoi:
short thirty = 10 * 3;
Une affectation légale à la short
variable thirty
?
À son tour, ceci:
short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
ainsi que cette:
int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
ne compile pas car l'attribution d'une int
valeur à a short
n'est pas autorisée sans la conversion comme prévu.
Y a-t-il quelque chose de spécial à propos des littéraux numériques?
java
short
type-promotion
Plafond Gecko
la source
la source
short thirty = 10 * 3;
est très probablement remplacé parshort thirty = 30;
le compilateur qui est alors une instruction valide. (Je devrais cependant rechercher la section JLS pertinente).10 * 3
et initialise la variable avec le résultat. Dans votre exemple non fonctionnel, le calcul se produit au moment de l'exécution, où la JVM lance le court-circuit.final int ten = 10; final int three = 3; short thirty = ten * three;
compile bien.If short is automatically promoted to int in arithmetic operations
- ce n'est pas pertinent. Ni10
ne3
sont courts et ne sont pas promus, ils sont littérales.10
et3
sont évalués commeint
s par le compilateur?Réponses:
Parce que le compilateur remplace
10*3
par 30 au moment de la compilation . Donc, effectivement:short thirty = 10 * 3
est calculé au moment de la compilation.Essayez de changer
ten
etthree
definal short
(en leur faisant compiler des constantes de temps) et voyez ce qui se passe: PExaminez le code d'octet en utilisant
javap -v
pour les deux versions (10*3
etfinal short
). Vous pourrez voir qu'il y a peu de différence.Ok, donc, voici la différence de code d'octet pour différents cas.
Cas 1 :
Code d'octet:
Cas -2:
Code d'octet:
Cas -3:
Byte-code:
Dans le cas ci-dessus,
10
et3
sont tirés des variables localess1
ets2
la source
Try changing ten and three to final short
exercice :)you will see that there's no difference (between those two lines in the decompiled code)
car n'est-ce pas votre propos?case 10*3:
et similaire est légal dans une construction de commutateur.Oui, il se passe quelque chose de spécial avec le cas littéral:
10 * 3
sera évalué au moment de la compilation . Vous n'avez donc pas besoin d'une(short)
conversion explicite pour les littéraux multipliés.ten * three
n'est pas évaluable à la compilation et nécessite donc une conversion explicite.Ce serait une autre question si
ten
etthree
étaient marquésfinal
.la source
La réponse suivante ajoute la section JLS et quelques détails sur ce comportement.
Selon JLS §15.2 - Formes d'expressions
la source