суббота, 2 августа 2008 г.

+=

Обычно считают, что в Java x += y (и аналогично -=, *= и т.п.) является лишь сокращённой записью x = x + y. Но это не вся правда. Посмотрим на следующий пример:

short s = 1;
s = s + 1;

Этот код не компилируется, несмотря на то, что 1 + 1 = 2 представимо типом short! Причина не только в том, что литерал 1 имеет тип int. Не будет компилироваться и такой вариант:
short s1 = 1;
short s2 = 1;
s2 = s2 + s1;

То же самое можно было бы написать с типами byte и char. Причина в том, что результат арифметических операций с использованием типов short, byte, char имеет тип int. Мотивация этого такова: к примеру, сумма двух byte может легко быть больше того, что влезет в byte. Но код можно исправить следующим образом без явного преобразования типов:
short s = 1;
s += 1;

short s1 = 1;
short s2 = 1;
s2 += s1;

На самом деле x += y, вопреки распространённому мнению, эквивалентно
x = (тип x) (x + y);

Т.е. включает в себя преобразование результата к типу x. То же самое верно и для операторов -=, *= и т.п.

Комментариев нет: