new МАТРИЦА' (1. .10 => (1. .20 => 0.01)) - - явная инициализация

new БУФЕР (100) - - дан только дискриминант

new БУФЕР' (РАЗМЕР => 80, ПОЗ => 0, ЗНАЧЕНИЕ => (1. .80 => 'А'))

- - явная инициализация

  1. Статические выражения и статические подтипы

Некоторые выражения скалярного типа называются статическими. Ана­логично, статическими называют некоторые дискретные диапазоны, а обо­значения типов для некоторых скалярных подтипов называют обозначаю­щими статические подтипы.

Выражение скалярного типа называется статическим тогда и только тогда, когда каждое первичное является одним из перечисленных в под­пунктах от а до з, а каждая операция — это предопределенная операция и вычисление выражения дает значение (т. е. не возбуждает исключения) :

  1. литерал перечисления (включая символьный литерал) ;

  2. числовой литерал;

  3. именованное число;

  4. заданная явным описанием константа статического подтипа, инициа- лизованная статическим выражением;

  5. вызов функции, имя которой - знак операции, обозначающий пре­допределенную операцию, включая расширенное имя; каждый фактический параметр должен быть статическим выражением;

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

  7. квалифицированное выражение, обозначение типа которого задает статический подтип, а операнд — статическое выражение;

  8. заключенное в скобки статическое выражение.

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

Примечание. Точность вычисления статического выражения вещественного типа определена правилами в разд. 4.5.7. Если результат не является модельным (или хра­нимым) числом этого типа, то значение выражения, полученное при вычислении во время компиляции, не обязано совпадать со значением, которое получится при вычис­лении во время счета.

Атрибуты массивов не являются статическими, в частности, статическим не явля­ется атрибут RANGE.

  1. Универсальные выражения

Универсальное-выражение — это выражение, вырабатывающее резуль­тат универсального ..целого или универсального-вещественного типа.

Для универсального-целого типа предопределены те же операции, что и для любого целого типа. Для универсального-вещественного типа предоп­ределены те же операции, что и для любого плавающего типа. Кроме того, эти операции включают операции умножения и деления (табл. 4.13).

Таблица 4.13

Знак операции

Операция

Тип левого операн­да

Тип правого опе­ранда

Тип результата

*

Умножение

Универсальный- вещественный

Универсальный- целый

Универсальный _ целый

Универсальный- вещественный

Универсальный- вещественный Универсальный- вещественный

/

Деление

У ниверсальный _ вещественный

Универсальный- целый

Универсальный- вещественный

Точность вычисления универсального выражения типа универсальный_ вещественный обязана быть не ниже точности любого из предопределенных плавающих типов, поддержанных в реализации, исключая сам универсаль­ный-вещественный тип. Более того, если универсальное выражение — ста­тическое, то вычисление должно быть точным.

При вычислении операций универсального выражения, не являющегося статическим, возбуждение исключения NUMERIC—ERROR реализацией до­пускается только в том сйучае, если результат операции — вещественное число с абсолютным значением, превышающим наибольшее хранимое число самого точного предопределенного плавающего типа (исключая универсаль­ный-вещественный) , или целое значение большее, чем SYSTEM.МАХ_INT, либо меньшее, чем SYSTEM.MIN. INT.

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

Примеры:

1 + 1 -- 2

abs (-10) *3--30

КИЛО: constant : = 1000;

МЕГА: constant : = КИЛО * КИЛО; - - 1 _000_000

ДЛИНА: constant : = FLOAT'DIGITS * 2;

ПОЛ_ПИ: constant : = ПИ/2; -- см. 3.2.2

ГРАД_В_РАД: constant : = ПОЛ ПИ/90;

РАД-В-ГРАД: constant : = 1.0/ГРАД_В_РАД;

-- эквивалентно 1.0/((3.14159_26536/2)/90)

  1. ОПЕРАТОРЫ

Оператор определяет выполняемое действие; процесс .осуществления этого действия называется выполнением оператора.

В данной главе описываются общие правила, применимые ко всем опе­раторам, и некоторые операторы. Оператор вызова процедуры описывается в гл. 6. Операторы вызова входа, задержки, принятия, отбора и прекраще­ния описываются в гл. 9, оператор возбуждения — в гл. 11, а оператор ко­да - в гл. 13.


  1. Простые и составные операторы. Последовательности операторов

Оператор может быть или простым или составным. Простой оператор не содержит других операторов. Составной оператор содержит простые опе­раторы и другие составные операторы.

последовательность—операторов : : = оператор {оператор}

оператор : : = {метка} простой_оператор | {метка}составной_оператор простой—оператор : : = пустой—оператор

I

I оператор—возврата

I оператор—вызова—входа

I оператор—прекращения

I оператор—кода

оператор—присваивания | оператор—вызова_процедуры

I оператор_выхода

I оператор—перехода

I оператор—задержки

I

I оператор_выбора I оператор—блока I оператор—отбора

оператор возбуждения составной—оператор : : = условный—оператор

I оператор—цикла

I оператор-принятия

метка : : = «простое— имя_метки»

пустой—оператор : : = null;

Говорят, что имя каждой метки, стоящей перед оператором, помечает этот оператор. Имя метки (а также имя цикла или блока) неявно описано в конце раздела описаний самого внутреннего блока, тела подпрограммы, тела пакета, тела задачи или настраиваемого тела, которые содержат данный помеченный оператор (именованный оператор цикла или именованный опе­ратор блока). При отсутствии в операторе блока раздела описаний подразу­мевается, что оператор блока содержит неявный раздел описаний (с пред­шествующим declare).

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

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

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

Примеры помеченных операторов:

<<ЗДЕСЬ»<<КТО>><<ПУСТ»<<ТАМ» null; «ПОСЛЕ» X: = 1;

Примечание. Область действия описания начинается самим описанием (см. 8.2). Область действия неявного описания имени метки, цикла или блока начинается до пер­вого явного вхождения соответствующего имени, поскольку это вхождение возможно лишь в качестве метки оператора, в операторе блока, операторе цикла или операторе перехода. Неявное описание в операторе блока может скрыть описание, данное во внешнем программном модуле или операторе блока (согласно обычным правилам скрытия, изложенным в разд. 8.3).

  1. Операторы присваивания

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

оператор_присваивания : : = тля_переменной : = выражение;

При выполнении оператора присваивания вначале вычисляются имя пе­ременной и выражение в некотором порядке, не определенном в языке. За­тем, если переменная не является массивом, проверяется принадлежность значения выражения подтипу переменной (если же переменная — массив, то при присваивании производится преобразование подтипа, как описано в разд. 5.2.1). Наконец, значение выражения становится новым значением пе­ременной.

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

Примеры:

ЗНАЧЕНИЕ : = МАКС_ЗНАЧЕНИЕ -1;

ОТТЕНОК : = ГОЛУБОЙ;

СЛЕДУЮЩЕЕ-ОБРАМЛЕНИЕ (F) (М, N) : 2.5 - - см. 4.1.1

А: = СКАЛ_ПРОИЗВЕДЕНИЕ (В, С); - - см. 6.5

ПИШУЩЕЕ-УСТРОЙСТВО : = (СОСТОЯНИЕ => ОТКРЫТО, УСТРОЙСТВО => ПЕЧАТЬ, КОЛ_СТРОЧЕК => 60); - - см. 3.7.3

■ СЛЕДУЮЩИЙ-АВТО. all : = (72074, null); - - см. 3.8.1

Примеры проверок ограничений:

I, J: INTEGER range 1. .10;

К: INTEGER range 1. .20;

  1. — J; - - одинаковые диапазоны

К: = J; --совместимые диапазоны

  1. = К; - - при К > 10 возбудится исключение CONSTRAINT-ERROR

Примечание. Значения дискриминантов объекта, указанного ссылочным значе­нием, не могут быть изменены (даже присваиванием составного значения всему объек­ту) , поскольку такие объекты, созданные генераторами, всегда являются ограничен­ными (см. 4.8); однако подкомпоненты таких объектов могут и не быть ограничен­ными.

Если выражение в правой части является числовым литералом, именованным чис­лом или атрибутом, вырабатывающим результат типа универсальный _целый или уни- версальный-вещественный, то производится неявное преобразование типа, описанное в разд. 4.6.

Определение типа переменной в левой части оператора присваивания может потре­бовать рассмотрения выражения, если имя переменной может интерпретироваться как имя переменной, указанной ссылочным значением, возвращаемым вызовом функ- Йии, а также как компонент или отрезок такой переменной (см. разд. 8.7 о контексте разрешения совмещения).

  1. П р и с в а и в а н и я массивов

Если переменная в левой части оператора присваивания является ин­дексируемой (в частности, отрезком), значение выражения неявно преоб­разуется в значение подтипа индексируемой переменной, после чего резуль­тат преобразования становится новым значением этой переменной.

Это значит, что новое значение каждого компонента индексируемой переменной задается сопоставляемым ей компонентом индексируемого значения, полученного при вычислении выражения (см. определение сопо­ставляемых компонентов в 4.5.2). При преобразовании подтипа для каждо­го компонента индексируемой переменной проверяется наличие сопостав­ляемого компонента индексируемого значения, и наоборот. При отрица­тельном результате этой проверки возбуждается исключение CONSTRAINT- ERROR, а значение'каждого компонента переменной не изменяется.

Примеры:

  1. STRING (1. .31);

  2. STRING (3. .33);

А: = В; - - одинаковое количество компонентов

А (1. .9): = ’’ПРЕКРАСНО”;

А(4. .12) : = А(1. .9); --А(1. .12) =’’ПРЕПРЕКРАСНО”

Примечание. Присваивание массива определено даже в случае перекрывающихся отрезков, поскольку выражение в правой части вычисляется до присваивания компо­нентов. Так, в случае последнего из приведенных примеров, реализация, вырабатыва­ющая А(1. .12) = ’’ПРЕПРЕПРЕПРЕ”, была бы некорректной (покомпонентная пере­дача недопустима).

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

  1. Условные операторы

Условный оператор выбирает для выполнения одну или ни одной из входящих в него последовательностей операторов, в зависимости от значе­ния (истинности) одного или нескольких условий.

условный оператор : : =

if условие then

последовательность—операторов

{elsif условие then

последовательность-операторов }

[else

последовательность_операторов]