Почему операторам Java + =, - =, * =, / = сложного присваивания не требуется кастинг?



Answers

Хорошим примером этого литья является использование * = или / =

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

или

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

или

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

или

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

До сегодняшнего дня я думал, что, например:

i += j;

это просто ярлык для:

i = i + j;

Но что, если мы попробуем это:

int i = 5;
long j = 8;

Тогда i = i + j; не будет компилироваться, но i += j; будет компилировать штраф.

Означает ли это, что на самом деле i += j; является ярлыком для чего-то вроде этого i = (type of i) (i + j) ?




Проблема здесь связана с литьем типов.

Когда вы добавляете int и long,

  1. Объект int заносится в long и оба добавляются, и вы получаете длинный объект.
  2. но длинный объект не может быть неявным образом передан в int. Итак, вы должны сделать это явно.

Но += закодирован таким образом, что он набирает тип. i=(int)(i+m)




Тонкая точка здесь ...

Существует неявный typecast для i+j когда j является double, а i - int. Java ALWAYS преобразует целое число в double при выполнении операции между ними.

Чтобы прояснить i+=j где i - целое число, а j - двойное, можно описать как

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

См. Это описание неявного литья

В этом случае вам может потребоваться приведение типа j к (int) для ясности.




Да,

в основном, когда мы пишем

i += l; 

компилятор преобразует это в

i = (int)(i + l);

Я просто проверил код файла .class .

Действительно хорошая вещь, чтобы знать




Иногда такой вопрос можно задать на собеседовании.

Например, когда вы пишете:

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

нет автоматического приведения типов. В C ++ не будет никакой компиляции ошибки, описанной выше, но в Java вы получите что-то вроде Incompatible type exception .

Чтобы избежать этого, вы должны написать свой код следующим образом:

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



Related