Pourquoi les opérateurs d'assignation composés Java + =, - =, * =, / = ne nécessitent-ils pas le cast?


Answers

Un bon exemple de ce casting est l'utilisation de * = ou / =

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

ou

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

ou

char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'

ou

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'
Question

Jusqu'à aujourd'hui, je pensais que par exemple:

i += j;

est juste un raccourci pour:

i = i + j;

Mais si nous essayons cela:

int i = 5;
long j = 8;

Alors i = i + j; ne compilera pas mais i += j; compilera bien.

Cela signifie-t-il qu'en fait i += j; est un raccourci pour quelque chose comme ça i = (type of i) (i + j) ?




Point subtil ici ...

Il existe un transtypage implicite pour i+j quand j est un double et i est un int. Java TOUJOURS convertit un entier en double lorsqu'il y a une opération entre eux.

Pour clarifier i+=ji est un entier et j est un double peut être décrit comme

i = <int>(<double>i + j)

Voir: cette description de la coulée implicite

Vous pourriez vouloir j dans (int) dans ce cas pour plus de clarté.




Le problème ici implique la coulée de type.

Lorsque vous ajoutez int et long,

  1. L'objet int est moulé à long et les deux sont ajoutés et vous obtenez un objet long.
  2. mais un objet long ne peut pas être implicitement casté en int. Donc, vous devez le faire explicitement.

Mais += est codé de telle façon qu'il ne lance que le type. i=(int)(i+m)




Parfois, une telle question peut être posée lors d'une interview.

Par exemple, lorsque vous écrivez:

int a = 2;
long b = 3;
a = a + b;

il n'y a pas de typecasting automatique. En C ++ il n'y aura pas d'erreur compilant le code ci-dessus, mais en Java vous obtiendrez quelque chose comme Incompatible type exception .

Donc, pour l'éviter, vous devez écrire votre code comme ceci:

int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting



Oui,

fondamentalement quand nous écrivons

i += l; 

le compilateur convertit cela en

i = (int)(i + l);

Je viens de vérifier le code du fichier .class .

Vraiment une bonne chose à savoir




Related