Шаг 28.
Язык программирования C#. Начала
Базовые типы и операторы. Сокращенные формы операции присваивания

    На этом шаге мы рассмотрим особенности использования сокращенных форм операций присваивания.

    Допустим, что - это некоторый бинарный оператор (арифметический или побитовый). Если нам необходимо выполнить операцию вида А=А♣В (то есть вычислить значение выражения А ♣ В на основе оператора , а затем результат выражения присвоить значением переменной А), то такая операция может быть реализована с помощью команды А♣=В. Например, вместо выражения А=А+В можно использовать команду А+=B. Аналогично команду А=А<<В можно записать как А<<=В или вместо выражения А=А^В использовать выражение А^=В. Во всех перечисленных случаях говорят о сокращенной форме операции присваивания.

    Помимо очевидного "эстетического" удобства, сокращенные формы операции присваивания имеют еще одно несомненное преимущество. Чтобы понять, в чем оно состоит, рассмотрим небольшой блок программного кода, в котором переменная А в итоге получает значение 15:

  byte А=10, В=5;
  А=(byte)(А+В);

    В нем проиллюстрирована уже знакомая нам ситуация: чтобы присвоить переменной А новое значение, необходимо использовать автоматическое приведение типа.


Переменные А и В объявлены как относящиеся к типу byte. Но при вычислении выражения А+В выполняется автоматическое расширение до типа int. Поэтому, если мы хотим выражение А+В присвоить значением переменной А (типа byte), то перед выражением А+В следует указать инструкцию (byte) - то есть выполнить приведение int-значения к byte-значению.

    Но если мы используем сокращенную форму операции присваивания, то явное приведение типа выполнять нс нужно:

  byte А=10, В=5;
  А+=В;

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

    На следующем шаге мы рассмотрим тернарный оператор.




Предыдущий шаг Содержание Следующий шаг