Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дал У.И.Симула 67.doc
Скачиваний:
8
Добавлен:
01.03.2025
Размер:
216.58 Кб
Скачать

6. ОПЕРАТОРЫ

6.1. ОПЕРАТОРЫ ПРИСВАИВАНИЯ

Знак операции := (читается — становится равным) озна­чает:— присваивание некоторого значения переменной обык- - новенного типа или идентификатору процедуры обык­новенного типа, являющемуся ЛЧ значений, или

—. присваивание текстового значения тексту, на который ссылается ЛЧ значений.

Знак операции : — (читается — начинает обозначать) озна­чает: — присваивание " ссылки переменной ссылочного типа или идентификатору процедуры ссылочного типа, являющемуся ЛЧ ссылок.

В этом контексте идентификатор процедуры означает уча­сток памяти (ячейку), локальный в соответствующем эк­земпляре процедуры. Содержимое этого участка и является значением или ссылкой, доставляемой соответствующим ука­зателем функции при его вычислении.

Присваиваемое значение (или ссылка) является копией значения (или ссылки), получающегося при вычислении ПЧ значений (или ссылок). Если ПЧ сама есть присваивание, то

доставляемое ею значение является копией значения, при­своенного при ее выполнении в качестве присваивания.

Любое выражение, которое является ЛЧ или его состав­ной частью, вычисляется раньше вычисления ПЧ. Подробное описание присваивания текстовых значений см. в разд. 10.6.

Для объектов не существует присваивания значений.

Тип значения или ссылки, получающейся при вычислении ПЧ, должен совпадать с типом ЛЧ. Из этого правила допу­скаются исключения, рассматриваемые ниже. .. • "

Если ЛЧ является формальным параметром, а тип соот­ветствующего фактического параметра не совпадает с типом формально^ спецификации, то операция присваивания вы­полняется в два этапа:

1) выполняется присваивание значения ПЧ некоторой фиктивной переменной типа, специфицированного для фор­мального параметра;

* 2) выполняется присваивание, ЛЧ которого является фак­тический параметр, а ПЧ — упомянутая фиктивная пере­менная.

Значением (или ссылкой), получающимся при вычисле­нии присваивания, является в этом случае содержимое упо­мянутой фиктивной переменной.

Относительно присваивания ссылок на текст см. разд. 10.5.

6.1.2.1. Присваивание арифметических значений

Так же как и в языке АЛГОЛ-60, любое арифметическое значение может быть присвоено ЛЧ типа real или integer. При необходимости выполняется соответствующая функция преобразования. '

В качестве примера рассмотрим оператор (не допусти­мый, однако, в языке АЛГОЛ-60)

где X и Y суть переменные типа real, i—переменная типа integer, a F — формальный параметр, вызываемый по найме-' нованию и специфицированный как real. Если фактическим-параметром, соответствующим F, является переменная типа real, то X, /, У и F получают значения 3, 3, 3.14 и 3.14 соот-'. ветственно. Если же фактическим параметром, соответствую­щим F, является переменная типа integer, то X, £, У и F по­лучают значения 3, 3, 3.14 и 3 соответственно.

6.1.2.2. Присваивание ссылок на объект

Пусть ЛЧ присваивания ссылок на объект квалифициро­вана идентификатором класса С/, и пусть ПЧ квалифициро­ вана идентификатором класса Сг. Если ПЧ сама является присваиванием ссылок, то Сг по определению является квали­ фикацией ЛЧ этого последнего присваивания. Пусть V есть значение, получающееся при вычислении ПЧ. Законность и результат присваивания ссылок зависят от соотношения ме­жду С/, Сг и V. L

Случай 1. Класс С1 содержит класс Сг. Присваиваниессылок законно, и операция присваивания вы­полняется.

Случай 2. Класс С1 является подклассом класса Сг. При­сваивание законно. Оно выполняется, если V есть попе, или является объектом класса С1/, или подкласса класса С1. В противном случае выдается сообщение об ошибке.

Случай 3. С1 и Сг не удовлетворяют ни одному из ука­занных выше условий. Присваивание неза­конно.

Аналогичные правила приложимы также к неявным при­сваиваниям параметру цикла и к передаче параметров.

' Пример 1:

Пусть Гаусс есть класс, декларированный в примере в разд. 2.2.

ref (Гаусс) *G5, G10;

G5: —new Гаусс (5); G10: — new Гаусс (10);

Значениями переменных G5 и G10 являются теперь объекты класса Гаусс. См' также пример 1 в разд. 7.1.2.

Пример 2:

Пусть точка и поляр — это классы, декларированные а примере разд. 2.2.2. :

ref (точка) PI, Р2; ref (поляр) РЗ;

Р\ : — new поляр (3, 4); Р2 : — new точка (5, 6);

Оператор РЗ:— Р\ присвоит переменной РЗ ссылку на объект класса поляр, который сам является значением пере­менной Р1. Оператор РЗ :— Р2 привел бы к выдаче сообще­ния об ошибке во время его выполнения.

6.2. ОПЕРАТОРЫ ЦИКЛА .

6.2.2. Семантика

Конструкция (список объектов) аналогична по смыслу конструкции (АЛГОЛ-список цикла). Расширение оператора цикла облегчает обработку списочных структур.

Каждое неявное присваивание ссылок подчиняется пра­вилам из разд. 6.1.2.2.

6.3. БЛОКИ С ПРЕФИКСАМИ

6.3.2. Семантика „

Экземпляр блока с префиксом является составным объек­том, префиксная часть которого есть объект класса, ука­занного префиксом блока, а ядро — экземпляром ядра блока. Формальные параметры префиксной части получают исход­ные значения в соответствии с фактическими параметрами префикса.

Сочленение производится в соответствии с правилами, аналогичными правилам разд. 2.2.2.

При образовании блоков с префиксами необходимо со­блюдать следующие ограничения:Объект, в котором встречается ссылка на него самого через некоторый локальный объект, не может быть префикс­ ной частью экземпляра блока с префиксом.

Идентификатор класса некоторого префикса блока должен идентифицировать класс, локальный в наименьшем блоке, охватывающем блок с префиксом. Если этот иденти­ фикатор является идентификатором системного класса, то'он относится к некоторой фиктивной декларации этого систем­ ного класса, как' бы находящейся в начале наименьшего охватывающего блока. В конкретных реализациях языка можно ограничить количество различных блочных уровней, на которых можно пользоваться такими префиксами (см. разд. 11 и 14).

*■ Экземпляр блока с префиксом является самостоятельным объектом (см. разд. 9). Программа считается вложенной в не­который блок с префиксом (см. разд. 11), поэтому она яв­ляется самостоятельным объектом.

Пример:

Пусть расстановка означает класс, декларированный в примере разд. 2.2.3. Тогда внутри блока с префиксом

расстановка (64) begin integer procedure оценка (Т);

text Г; :....;

end

можно обращаться к процедуре номер (декларированной в классе расстановка), использующей процедуру оценка, декла­рированную в ядре блока.