Одновременные присваивания.
Оператор BEGIN может присвоить значение более чем одной переменной. Возможность обобщения эффекта оператора BEGIN настолько важна, что она будет сделана в виде комментария к CF Pascal, называемого одновременным присваиванием (concurrent assignment). Паскаль-машина не имеет возможности выполнять одновременные присваивания – они не являются частью синтаксиса Паскаля. Однако, в формате комментария будет присутствовать как простое расширение оператора присваивания CF Pascal. Список переменных, встречающихся слева от оператора присваивания и список выражений встречающихся справа, оба эти списка одинаковой длины. Одновременное присваивание выражает знание, что выражения, вычисленные одновременно, являются значениями соответствующих переменных. Например, результат выполнения оператора BEGIN: BEGIN V1:= ‘A’; V2:= ‘B’ END Может быть представлен одновременным присваиванием: <V1, V2>:= <’A’, ‘B’> Тогда как результат выполнения оператора BEGIN V1:= ‘A’; V2:= ‘B’ END будет представлен: <V1 >:= <‘B’> Угловые скобки списков могут быть опущены, если это не вызовет путаницы, например: V1, V2:= ’A’, ‘B’ С использованием одновременного присваивания получаются отличные комментарии, потому что они точно выражают, каков должен быть результат оператора BEGIN. Например: BEGIN {V1:= ‘B’} V1:= ‘A’; V2:= ‘B’ END Комментарий уточняет, что такая конструкция сделана намеренно, а не по ошибке.
Для любых символов x, y, z
BEGIN V3:= V2; V2: V1 END ({V1·x, V2·y, V3·z, …}) = {V1·x, V2·x, V3·y, …} Одновременное присваивание BEGIN V3:= V2; V2:= V1 END Может быть представлено в комментированной версии: BEGIN {V2, V3:= V1, V2} V3:= V2; V2:= V1 END Преимущество одновременного присваивания над частным значением то, что в нем присутствуют только измененные переменные. Другие переменные могут присутствовать в состоянии выполнения, но если они не появляются в левой части одновременного присваивания, их значение не меняется.
Одновременные присваивания помогают определить значение части программы. Примеры операторов BEGIN приведенные выше были простыми, рассмотрим другие:
Второе и третье присваивания поменяли местами. Мы можем вычислить фугкции частного значения для E и F, принимая x, y, z – любые символы.
E({V1·x, V2·y V3·z, …}) = (V1:= V2◦V2:= V3◦V3:= V1)({V1·x, V2·y V3·z, …}) = (V2:= V3◦V3:= V1)({V1·y, V2·y V3·z, …}) = (V3:= V1)({V1·y, V2·z V3·z, …}) = {V1·y, V2·z V3·y, …}
и F({V1·x, V2·y V3·z, …}) = (V1:= V2◦V3:= V1◦V2:= V3)({V1·x, V2·y V3·z, …}) = (V3:= V1◦V2:= V3)({V1·y, V2·y V3·z, …}) = (V2:= V3)({V1·y, V2·y V3·y, …}) = {V1·y, V2·y V3·y, …} В E совокупный эффект - уничтожение старого значения V1 и обмен значениями V2 и V3, что обобщается одновременным присваиванием: V1, V2, V3:= V2, V3, V2 F имеет несколько иное значение, а именно – присвоить всем переменным изначальное значение V2: V1, V3:= V2, V2 Добавление к операторам BEGIN комментариев с одновременным присваиванием делает их понимание более ясным:
E – пример часто встречающегося блока, который обменивает значения V2 и V3, используя V1 как переменную для сохранения промежуточного значения. Такие блоки как F обычно пишутся по ошибке.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|