Расширенное присвоение

редактировать

Расширенное назначение (или составное присвоение ) - это имя присваивается определенным операторам присвоения в определенных языках программирования (особенно в тех, которые являются производными от C ). Расширенное присваивание обычно используется для замены оператора, в котором оператор принимает переменную в качестве одного из своих аргументов, а затем присваивает результат той же переменной. Простым примером является x + = 1, который расширяется до x = x + (1). Подобные конструкции часто доступны для различных бинарных операторов.

Как правило, в языках, предлагающих эту функцию, большинство операторов, которые могут принимать переменную в качестве одного из своих аргументов и возвращать результат того же типа, имеют эквивалент расширенного присваивания, который присваивает результат обратно переменной на месте, включая арифметические операторы, операторы битового сдвига и побитовые операторы.

Содержание
  • 1 Обсуждение
  • 2 Семантика
    • 2.1 Вычисляемые местоположения присваивания
  • 3 По языку
    • 3.1 Потомки C
  • 4 Поддерживаемые языки
  • 5 См. Также
  • 6 Ссылки
Обсуждение

Например, следующий оператор или его вариант можно найти во многих программах:

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 ++ и C # оператор присваивания =, который дополняется следующим образом:

ОператорОписание
+=Сложение
-=Вычитание
*=Умножение
/=Деление
%=Модуль
<<=Левый битовый сдвиг
>>=Правый битовый сдвиг
=Поразрядное И
^=Поразрядное исключающее ИЛИ
|=Поразрядное исключающее ИЛИ

Каждый из них в указанных языках называется составным оператором присваивания.

Поддерживающие языки

В следующем списке, хотя он не является полным или исчерпывающим, перечислены некоторые из основных языков программирования, поддерживающих расширенные операторы присваивания.

См. Также
Ссылки
Последняя правка сделана 2021-06-12 17:20:32
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте