¿Por qué los operadores de asignación de compuestos + =, - =, * =, / = de Java no requieren conversión?


Answers

Un buen ejemplo de este casting es usar * = o / =

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

o

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

o

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

o

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

Hasta hoy, pensé que, por ejemplo:

i += j;

es solo un atajo para:

i = i + j;

Pero, ¿y si probamos esto?

int i = 5;
long j = 8;

Entonces i = i + j; no compilará pero i += j; compilará bien

¿Significa que, de hecho, i += j; es un atajo para algo como esto i = (type of i) (i + j) ?




Punto sutil aquí ...

Hay un tipo de transmisión implícita para i+j cuando j es un doble e i es un int. Java SIEMPRE convierte un entero en un doble cuando hay una operación entre ellos.

Para aclarar i+=j donde i es un entero y j es un doble se puede describir como

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

Ver: esta descripción de la fundición implícita

Es posible que desee encasillar j a (int) en este caso para mayor claridad.




El problema aquí involucra el tipo de casting.

Cuando agrega int y largo,

  1. El objeto int se convierte a largo y ambos se agregan y obtienes el objeto largo.
  2. pero el objeto largo no se puede convertir implícitamente en int. Entonces, tienes que hacer eso explícitamente.

Pero += está codificado de tal manera que sí lo hace. i=(int)(i+m)




Sí,

básicamente cuando escribimos

i += l; 

el compilador convierte esto a

i = (int)(i + l);

Acabo de comprobar el código de archivo .class .

Realmente es bueno saber




A veces, tal pregunta se puede hacer en una entrevista.

Por ejemplo, cuando escribes:

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

no hay encasillado automático. En C ++ no habrá ningún error compilando el código anterior, pero en Java obtendrá algo como Incompatible type exception .

Para evitarlo, debes escribir tu código así:

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



Related