На этом шаге мы рассмотрим особенности использования сокращенных форм операций присваивания.
Допустим, что ♣ - это некоторый бинарный оператор (арифметический или побитовый). Если нам необходимо выполнить операцию вида А=А♣В (то есть вычислить значение выражения А ♣ В на основе оператора ♣, а затем результат выражения присвоить значением переменной А), то такая операция может быть реализована с помощью команды А♣=В. Например, вместо выражения А=А+В можно использовать команду А+=B. Аналогично команду А=А<<В можно записать как А<<=В или вместо выражения А=А^В использовать выражение А^=В. Во всех перечисленных случаях говорят о сокращенной форме операции присваивания.
Помимо очевидного "эстетического" удобства, сокращенные формы операции присваивания имеют еще одно несомненное преимущество. Чтобы понять, в чем оно состоит, рассмотрим небольшой блок программного кода, в котором переменная А в итоге получает значение 15:
byte А=10, В=5; А=(byte)(А+В);
В нем проиллюстрирована уже знакомая нам ситуация: чтобы присвоить переменной А новое значение, необходимо использовать автоматическое приведение типа.
Но если мы используем сокращенную форму операции присваивания, то явное приведение типа выполнять нс нужно:
byte А=10, В=5;
А+=В;
В данном случае переменная А также получит значение 15. Причем инструкцию (byte) мы не использовали - в этом нет необходимости. Объяснение состоит в том, что команда вида А=А♣В в действительности вычисляется немного сложнее, чем выполнение команды А=А♣В. Точнее, если результат выражения А♣В может быть автоматически преобразован к типу переменной А, то проблемы нет вообще. Но если для результата выражения А♣В автоматического преобразования к типу переменной А нет, то схема иная. А именно если результат выражения А♣В может быть явно преобразовал к типу переменной А, а тип переменной В при этом может быть неявно преобразован к типу переменной А, то преобразование результата выражения А♣В к типу переменной А выполняется автоматически (без явного указания инструкции приведения типа). Проще говоря, если результат выражения А♣В можно преобразовать (с помощью процедуры явного приведения типа) к типу переменной А (первое условие) и если тип переменной B такой, что допускается неявное преобразование к типу переменной А (второе условие), то выражение А♣=В вычисляется как А=(тип А) (А♣В). После вычисления выражения А♣В полученное значение автоматически преобразуется к типу переменной А, а затем выполняется операция присваивания. Например, проанализируем команду А+=В, в которой переменные А и В относятся к типу byte. Значение выражения А+В - это число типа int. А присваивать значение нужно переменной типа byte. Тип int в тип byte автоматически не преобразуется. Но такое преобразование можно выполнить явно. То есть первое условие выполнено. Далее, переменная В относится к типу byte. Необходимо, чтобы для типа переменной В существовала возможность неявного преобразования к типу переменной А. Но в данном случае эти типы просто совпадают, поэтому второе условие тоже выполнено. Следовательно, результат выражения А+В автоматически преобразуется к типу переменной А (тип byte).
На следующем шаге мы рассмотрим тернарный оператор.