101 votes

Pourquoi l'expression "short thirty = 3 * 10" est-elle un devoir légal ?

Si short est automatiquement promu au rang de int dans les opérations arithmétiques, alors pourquoi :

short thirty = 10 * 3;

Une cession légale au short variable thirty ?

A son tour, ceci :

short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED

ainsi que ceci :

int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED

ne compile pas car l'affectation d'un int à une valeur short n'est pas autorisé sans casting comme prévu.

Y a-t-il quelque chose de spécial à propos des littéraux numériques ?

138voto

TheLostMind Points 10813

Parce que le compilateur remplace 10*3 avec 30 à temps de compilation même. Donc, effectivement : short thirty = 10 * 3 est calculé au moment de la compilation.

Essayez de changer ten et three a final short (en les rendant constantes au moment de la compilation) et voyez ce qui se passe :P

Examiner le code d'octet en utilisant javap -v pour les deux verisions ( 10*3 et final short ). Vous serez en mesure de voir la différence.

18voto

Bathsheba Points 23209

Oui, il y a quelque chose de spécial qui se passe avec le cas littéral : 30 * 3 sera évalué à compiler temps. Vous n'avez donc pas besoin d'une (short) conversion pour les littéraux multipliés.

ten * three n'est pas évaluable au moment de la compilation et nécessite donc une conversion explicite.

Ce serait une autre affaire si ten et three ont été marqués final .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X