Операторы присваивания с операцией |
Операторы присваивания, совмещенные с операцией, позволяют в ряде случаев сократить запись оператора присваивания. Например, вместо
i := i + j;
можно написать
i += j;
Использование операторов присваивания с операцией повышает читабельность кода, т.к. явно выделяется смысл выполняемого действия. Кроме того, операторы присваивания с операцией выполняются заметно быстрее за счет оптимизации выполняемых действий.
Операторы присваивания с операцией подчиняются тем же правилам и ограничениям, что и обычный оператор присваивания (см. "Оператор присваивания. ").
Однако имеется одно существенное отличие: операторы присваивания с операцией возвращают в качастве результата копию измененного значения первого операнда, в то время как обычный оператор присваивания возвращает ссылку на переменную, которой присваивается результат.
Типы операндов должны удовлетворять требованиям для соответствующих операций (см. "Операции. ").
<присваивание-с-операцией> = <имя> <операция> <выражение>;
<имя> - идентификатор переменной, которая будет использована в качестве первого операнда выполняемой операции. Ей же будет присвоено полученное значение.
<операция> - один из составных символов:
<операция> = += | -= | *= | /= | |= | &=
+= - присваивание с операцией сложения. Увеличивает значение первого операнда на значение второго операнда, приведенного к типу первого. Например:
Message(i+=j);
эквивалентно:
Message(i+j); i := i + j;
При переполнении первого операнда выдается исключение.
-= - присваивание с операцией вычитания. Уменьшает значение первого операнда на значение второго операнда, приведенного к типу первого. Например:
Message(i-=j);
эквивалентно:
Message(i-j); i := i-j;
*= - присваивание с операцией умножения. Изменяет значение первого операнда, умножая его на значение второго операнда, приведенного к типу первого. В зависимости от типа данных первого операнда производится либо целочисленное умножение, либо умножение с плавающей точкой. Например:
Message(i*=j);
эквивалентно:
Message(i*j); i := i * j;
/= - присваивание с операцией деления. Изменяет значение первого операнда, деля его на значение второго операнда, приведенного к типу первого . В зависимости от типа данных первого операнда производится либо целочисленное деление, либо деление с плавающей точкой. Например:
Message(i/=j);
эквивалентно:
Message(i / j); // или i div j i := i / j; // или i div j
|= - выполняемая операция зависит от типа первого операнда:
если первый операнд имеет булевский тип, то выполняется логическое присваивание с операцией дизъюнкции. Оператор изменяет значение первого операнда, применяя операцию "логическое или" к его значению со значением второго операнда, приведенного к типу boolean;
если первый операнд имеет целочисленный тип, то выполняется побитовое присваивание с операцией дизъюнкции. Оператор изменяет значение первого операнда, побитово применяя к его значению операцию дизъюнкции (or) с сопряженными битами второго операнда, приведенного к типу первого.
к остальным типам данных оператор неприменим.
&= - выполняемая операция зависит от типа первого операнда:
если первый операнд имеет булевский тип, то выполняется логическое присваивание с операцией конъюнкции. Оператор изменяет значение первого операнда, применяя операцию "логическое и" к его значению со значением второго операнда, приведенного к типу boolean;
если первый операнд имеет целочисленный тип, то выполняется побитовое присваивание с операцией конъюнкции. Оператор изменяет значение первого операнда, побитово применяя к его значению операцию конъюнкции (and) с сопряженными битами второго операнда, приведенного к типу первого.
к остальным типам данных оператор неприменим.
<выражение> - выражение, которое будет использовано в качестве второго операнда выполняемой операции.
Пример 1
var i : word; i*=0; // Обнуляем значение переменной if (i = 1) ... ; // Сравнение переменной с 1. Результат false. i += 1; // Прибавляем к переменной i 1. if (i = 1) ... ; // Сравнение переменной с 1. Результат true. // Ошибка при компиляции: нет операторов '+++' и '---' i +++= 1; // Ошибка при компиляции: // Попытка изменения вычисляемого выражения (i++) i ++ += 1;
Пример 2
i := 1; i := (i += 2) + (i += 3); Message(i);
В приведенном примере Message покажет 9, т.к. оператор присваивания с операцией (сложения в данном случае) возвращает копию результата.
В похожем примере с обычным присвоением Message покажет 12:
i := 1; i := (i := i + 2) + (i := i + 3); Message(i);
Это происходит потому, что после выполнения операций в обеих скобках переменная i примет значение 6. А т.к. оператор присваивания возвращает не результат присваивания, а ссылку на переменную-получателя, то сложение будет производиться не между значениями 3 и 6, а между значениями i и i. Которые всегда одинаковы и к этому времени будут равны 6. См. также пример 4 из раздела "Оператор присваивания. ".
Операторы присваивания с операцией доступны начиная с Атлантис 5.3.09.