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


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 eso de hecho? i += j; es un atajo para algo como esto i = (type of i) (i + j)?


3283
2018-01-03 10:10


origen


Respuestas:


Como siempre con estas preguntas, el JLS tiene la respuesta. En este caso §15.26.2 Operadores de asignación de compuestos. Un extracto:

Una expresión de asignación compuesta de la forma E1 op= E2 es equivalente a E1 = (T)((E1) op (E2)), dónde T es el tipo de E1, excepto eso E1 es evaluado solo una vez

Un ejemplo citado de §15.26.2

[...] el siguiente código es correcto:

short x = 3;
x += 4.6;

y resulta en x que tiene el valor 7 porque es equivalente a:

short x = 3;
x = (short)(x + 4.6);

En otras palabras, tu suposición es correcta.


2210
2018-01-03 10:15



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'

442
2018-01-03 10:20



Muy buena pregunta. los Especificación del lenguaje Java confirma tu sugerencia

Por ejemplo, el siguiente código es correcto:

short x = 3;
x += 4.6;

y resulta en x que tiene el valor 7 porque es equivalente a:

short x = 3;
x = (short)(x + 4.6);

223
2018-01-03 10:17



Sí,

básicamente cuando escribimos

i += l; 

el compilador convierte esto a

i = (int)(i + l);

Acabo de comprobar el .class código de archivo

Realmente es bueno saber


163
2018-01-03 10:19



necesitas lanzar desde long a int  explicitly en caso de i = i + l  luego compilará y dará salida correcta. me gusta

i = i + (int)l;

o

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

pero en caso de += simplemente funciona bien porque el operador realiza implícitamente el tipo de conversión del tipo de variable derecha al tipo de variable izquierda, por lo que no necesita emitir explícitamente.


85
2018-01-03 10:15



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í escribe "casting". i=(int)(i+m)


56
2018-01-03 10:20



En Java, las conversiones de tipo se realizan automáticamente cuando el tipo de la expresión en el lado derecho de una operación de asignación se puede promover de manera segura al tipo de la variable en el lado izquierdo de la asignación. Por lo tanto, podemos asignar de manera segura:

 byte -> corto -> int -> largo -> flotante -> doble. 

Lo mismo no funcionará al revés. Por ejemplo, no podemos convertir automáticamente un largo en un int porque el primero requiere más almacenamiento que el segundo y, en consecuencia, la información puede perderse. Para forzar tal conversión, debemos llevar a cabo una conversión explícita.
Tipo - Conversión


47
2018-01-23 05:50



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ás algo así 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

37
2017-12-02 10:40