Расширенное назначение (или составное присвоение ) - это имя присваивается определенным операторам присвоения в определенных языках программирования (особенно в тех, которые являются производными от C ). Расширенное присваивание обычно используется для замены оператора, в котором оператор принимает переменную в качестве одного из своих аргументов, а затем присваивает результат той же переменной. Простым примером является x + = 1
, который расширяется до x = x + (1)
. Подобные конструкции часто доступны для различных бинарных операторов.
Как правило, в языках, предлагающих эту функцию, большинство операторов, которые могут принимать переменную в качестве одного из своих аргументов и возвращать результат того же типа, имеют эквивалент расширенного присваивания, который присваивает результат обратно переменной на месте, включая арифметические операторы, операторы битового сдвига и побитовые операторы.
Например, следующий оператор или его вариант можно найти во многих программах:
x = x + 1
Это означает «найти число, хранящееся в переменной x, прибавить к нему 1 и сохранить результат сложения в переменной x». Каким бы простым это ни казалось, он может иметь неэффективность, поскольку местоположение переменной x необходимо искать дважды, если компилятор не распознает, что две части выражения идентичны: x может быть ссылка на какой-либо элемент массива или другая сложность. Для сравнения, вот версия с расширенным присваиванием:
x + = 1
В этой версии нет оправдания тому, что компилятор не смог сгенерировать код, который просто ищет местоположение переменной x. один раз и модифицирует его на месте, если, конечно, машинный код поддерживает такую последовательность. Например, если x - простая переменная, последовательность машинного кода может выглядеть примерно так:
Загрузить x Добавить 1 Магазин x
, и такой же код будет сгенерирован для обе формы. Но если есть специальный код операции, это может быть
MDM x, 1
, что означает «изменить память», добавив 1 к x, и достойный компилятор сгенерирует один и тот же код для обоих формы. Некоторые машинные коды предлагают операции INC и DEC (для добавления или вычитания единицы), другие могут допускать константы, отличные от единицы.
В более общем смысле это
x ?= выражение
, где ? обозначает некоторый оператор (не всегда + ), а там может быть никаких специальных кодов операций в помощь. По-прежнему существует вероятность того, что если x - сложная сущность, компилятору будет рекомендовано избегать дублирования при доступе к x, и, конечно, если x - длинное имя, потребуется меньше ввода. Последнее было основой аналогичной функции в компиляторах ALGOL, предлагаемых в системах Burroughs B6700, с использованием символа тильды для обозначения переменной, которой назначается, так что
Длинное имя: = x + sqrt (Длинное имя) * 7;
станет
LongName: = x + sqrt (~) * 7;
и так далее. Это более общий характер, чем просто x: = ~ + 1; Создание оптимального кода останется прерогативой компилятора.
В языках программирования, ориентированных на выражения, таких как C, присваивание и расширенное присваивание - это выражения, которые имеют значение. Это позволяет использовать их в сложных выражениях. Однако при этом могут образовываться последовательности символов, которые трудно читать или понимать, и, что еще хуже, опечатка может легко привести к другой последовательности тарабарщины, которая, хотя и принята компилятором, не дает желаемых результатов. В других языках, таких как Python, присваивание и расширенное присваивание являются операторами, а не выражениями, и поэтому не могут использоваться в сложных выражениях. Например, следующее является допустимым C, но недопустимым Python:
a + = b + = c
Как и в случае с присваиванием, в этих языках расширенное присваивание является формой правоассоциативного присваивания.
В таких языках, как C, C ++ и Python, расширенное назначение, в котором местоположение назначения включает вызовы функций, требует только одного вызова функций. То есть в заявлении:
my_array [f1 ()] + = 1
Функция f1
должна вызываться только один раз.
Если язык реализует расширенное присваивание путем расширения макроса до:
my_array [f1 ()] = my_array [f1 ()] + 1
Тогда f1
вызывается дважды.
В C, C ++ и C # оператор присваивания =, который дополняется следующим образом:
Оператор | Описание |
---|---|
+= | Сложение |
-= | Вычитание |
*= | Умножение |
/= | Деление |
%= | Модуль |
<<= | Левый битовый сдвиг |
>>= | Правый битовый сдвиг |
= | Поразрядное И |
^= | Поразрядное исключающее ИЛИ |
|= | Поразрядное исключающее ИЛИ |
Каждый из них в указанных языках называется составным оператором присваивания.
В следующем списке, хотя он не является полным или исчерпывающим, перечислены некоторые из основных языков программирования, поддерживающих расширенные операторы присваивания.
|