Операторы присваивания с операцией Назад В начало Вперед

Операторы присваивания, совмещенные с операцией, позволяют в ряде случаев сократить запись оператора присваивания. Например, вместо

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

|= - выполняемая операция зависит от типа первого операнда:

&= - выполняемая операция зависит от типа первого операнда:

<выражение> - выражение, которое будет использовано в качестве второго операнда выполняемой операции.

Примеры

Пример 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.