new МАТРИЦА' (1. .10 => (1. .20 => 0.01)) - - явная инициализация
new БУФЕР (100) - - дан только дискриминант
new БУФЕР' (РАЗМЕР => 80, ПОЗ => 0, ЗНАЧЕНИЕ => (1. .80 => 'А'))
- - явная инициализация
Статические выражения и статические подтипы
Некоторые выражения скалярного типа называются статическими. Аналогично, статическими называют некоторые дискретные диапазоны, а обозначения типов для некоторых скалярных подтипов называют обозначающими статические подтипы.
Выражение скалярного типа называется статическим тогда и только тогда, когда каждое первичное является одним из перечисленных в подпунктах от а до з, а каждая операция — это предопределенная операция и вычисление выражения дает значение (т. е. не возбуждает исключения) :
литерал перечисления (включая символьный литерал) ;
числовой литерал;
именованное число;
заданная явным описанием константа статического подтипа, инициа- лизованная статическим выражением;
вызов функции, имя которой - знак операции, обозначающий предопределенную операцию, включая расширенное имя; каждый фактический параметр должен быть статическим выражением;
определяемый в языке атрибут статического подтипа; если атрибут - функция, фактические параметры должны быть также статическими выражениями;
квалифицированное выражение, обозначение типа которого задает статический подтип, а операнд — статическое выражение;
заключенное в скобки статическое выражение.
Статическим является диапазон, границы которого — статические выражения. Статическим является ограничение диапазона, если составляющие его атрибут диапазона или простые выражения являются статическими. Статический подтип - это либо скалярный базовый тип, отличный от формального типа настройки, либо скайярный подтип, образованный наложением на статический подтип, либо ограничения статическим диапазоном, либо ограничения плавающего или фиксированного типа, ограничение диапазона которого, если оно есть, является статическим. Статический дискретный диапазон — это либо статический подтип, либо статический диапазон. Статическое ограничение индекса — это ограничение индекса, для которого статическим является каждый подтип индекса соответствующего индексируемого типа и для которого статическим является каждый дискретный диапазон. Статическое ограничение дискриминанта -это ограничение дискриминанта, для которого статическим является подтип каждого дискриминанта и в котором статическим является каждое выражение.
Примечание. Точность вычисления статического выражения вещественного типа определена правилами в разд. 4.5.7. Если результат не является модельным (или хранимым) числом этого типа, то значение выражения, полученное при вычислении во время компиляции, не обязано совпадать со значением, которое получится при вычислении во время счета.
Атрибуты массивов не являются статическими, в частности, статическим не является атрибут RANGE.
Универсальные выражения
Универсальное-выражение — это выражение, вырабатывающее результат универсального ..целого или универсального-вещественного типа.
Для универсального-целого типа предопределены те же операции, что и для любого целого типа. Для универсального-вещественного типа предопределены те же операции, что и для любого плавающего типа. Кроме того, эти операции включают операции умножения и деления (табл. 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)
ОПЕРАТОРЫ
Оператор определяет выполняемое действие; процесс .осуществления этого действия называется выполнением оператора.
В данной главе описываются общие правила, применимые ко всем операторам, и некоторые операторы. Оператор вызова процедуры описывается в гл. 6. Операторы вызова входа, задержки, принятия, отбора и прекращения описываются в гл. 9, оператор возбуждения — в гл. 11, а оператор кода - в гл. 13.
Простые и составные операторы. Последовательности операторов
Оператор может быть или простым или составным. Простой оператор не содержит других операторов. Составной оператор содержит простые операторы и другие составные операторы.
последовательность—операторов : : = оператор {оператор}
оператор : : = {метка} простой_оператор | {метка}составной_оператор простой—оператор : : = пустой—оператор
I
I оператор—возврата
I оператор—вызова—входа
I оператор—прекращения
I оператор—кода
оператор—присваивания | оператор—вызова_процедурыI оператор_выхода
I оператор—перехода
I оператор—задержки
I
I оператор_выбора I оператор—блока I оператор—отбора
оператор возбуждения составной—оператор : : = условный—операторI оператор—цикла
I оператор-принятия
метка : : = «простое— имя_метки»
пустой—оператор : : = null;
Говорят, что имя каждой метки, стоящей перед оператором, помечает этот оператор. Имя метки (а также имя цикла или блока) неявно описано в конце раздела описаний самого внутреннего блока, тела подпрограммы, тела пакета, тела задачи или настраиваемого тела, которые содержат данный помеченный оператор (именованный оператор цикла или именованный оператор блока). При отсутствии в операторе блока раздела описаний подразумевается, что оператор блока содержит неявный раздел описаний (с предшествующим declare).
Имена меток, циклов и блоков неявно описываются в порядке появления в тексте программы начал соответствующих помеченных операторов, операторов цикла и операторов блока. Для ймен меток, циклов и блоков, неявно описанных в теле программного модуля, включая вложенные в это тело операторы блока, но исключая другие вложенные программные модули (т. е. подпрограммы, пакеты, задачи или настраиваемые модули), должны использоваться различные идентификаторы.
Выполнение пустого оператора заключается в переходе к выполнению следующего оператора.
Выполнение последовательности операторов состоит в поочередном выполнении отдельных операторов последовательности, пока они все не будут закончены или пока не произойдет передача управления. Передача управления вызывается выполнением операторов выхода, возврата или перехода, выбором альтернативы завершения, возбуждением исключения или (неявно) выполнением оператора прекращения.
Примеры помеченных операторов:
<<ЗДЕСЬ»<<КТО>><<ПУСТ»<<ТАМ» null; «ПОСЛЕ» X: = 1;
Примечание. Область действия описания начинается самим описанием (см. 8.2). Область действия неявного описания имени метки, цикла или блока начинается до первого явного вхождения соответствующего имени, поскольку это вхождение возможно лишь в качестве метки оператора, в операторе блока, операторе цикла или операторе перехода. Неявное описание в операторе блока может скрыть описание, данное во внешнем программном модуле или операторе блока (согласно обычным правилам скрытия, изложенным в разд. 8.3).
Операторы присваивания
Оператор присваивания заменяет текущее значение переменной новым значением, задаваемым выражением. Переменная в левой части оператора присваивания и выражение в его правой части должны быть одного и того же типа, однако тип не должен быть лимитируемым.
оператор_присваивания : : = тля_переменной : = выражение;
При выполнении оператора присваивания вначале вычисляются имя переменной и выражение в некотором порядке, не определенном в языке. Затем, если переменная не является массивом, проверяется принадлежность значения выражения подтипу переменной (если же переменная — массив, то при присваивании производится преобразование подтипа, как описано в разд. 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;
— J; - - одинаковые диапазоны
К: = J; --совместимые диапазоны
= К; - - при К > 10 возбудится исключение CONSTRAINT-ERROR
Примечание. Значения дискриминантов объекта, указанного ссылочным значением, не могут быть изменены (даже присваиванием составного значения всему объекту) , поскольку такие объекты, созданные генераторами, всегда являются ограниченными (см. 4.8); однако подкомпоненты таких объектов могут и не быть ограниченными.
Если выражение в правой части является числовым литералом, именованным числом или атрибутом, вырабатывающим результат типа универсальный _целый или уни- версальный-вещественный, то производится неявное преобразование типа, описанное в разд. 4.6.
Определение типа переменной в левой части оператора присваивания может потребовать рассмотрения выражения, если имя переменной может интерпретироваться как имя переменной, указанной ссылочным значением, возвращаемым вызовом функ- Йии, а также как компонент или отрезок такой переменной (см. разд. 8.7 о контексте разрешения совмещения).
П р и с в а и в а н и я массивов
Если переменная в левой части оператора присваивания является индексируемой (в частности, отрезком), значение выражения неявно преобразуется в значение подтипа индексируемой переменной, после чего результат преобразования становится новым значением этой переменной.
Это значит, что новое значение каждого компонента индексируемой переменной задается сопоставляемым ей компонентом индексируемого значения, полученного при вычислении выражения (см. определение сопоставляемых компонентов в 4.5.2). При преобразовании подтипа для каждого компонента индексируемой переменной проверяется наличие сопоставляемого компонента индексируемого значения, и наоборот. При отрицательном результате этой проверки возбуждается исключение CONSTRAINT- ERROR, а значение'каждого компонента переменной не изменяется.
Примеры:
STRING (1. .31);
STRING (3. .33);
А: = В; - - одинаковое количество компонентов
А (1. .9): = ’’ПРЕКРАСНО”;
А(4. .12) : = А(1. .9); --А(1. .12) =’’ПРЕПРЕКРАСНО”
Примечание. Присваивание массива определено даже в случае перекрывающихся отрезков, поскольку выражение в правой части вычисляется до присваивания компонентов. Так, в случае последнего из приведенных примеров, реализация, вырабатывающая А(1. .12) = ’’ПРЕПРЕПРЕПРЕ”, была бы некорректной (покомпонентная передача недопустима).
Описанное выше явное преобразование подтипа выполняется только на уровне значения всего выражения правой части, но не для его подкомпонентов, являющихся индексируемыми значениями.
Условные операторы
Условный оператор выбирает для выполнения одну или ни одной из входящих в него последовательностей операторов, в зависимости от значения (истинности) одного или нескольких условий.
условный оператор : : =
if условие then
последовательность—операторов
{elsif условие then
последовательность-операторов }
[else
последовательность_операторов]