Н. Джехани - Язык Ада (1988) (1160771), страница 82
Текст из файла (страница 82)
висимо от целевого типа). Более того, недопустимо, чтобы операнд преобразования типа был литералом пмБ, генератором, агрегатом или строковым литералом; задание в качестве операн. да преобразования типа выражения, заключенного в скобки, допускается, только если само выражение является допустимым.
Преобразование к подтипу состоит в преобразовании к целевому типу с последующей про. веркой принадлежности результата этому подтипу. Допускается преобразование операнда заданного типа к тому же самому типу. Другие явные преобразования типов допустимы в следующих трех случаях: а. Числовые типы. Операнд может быль любого числового типа, значение операнда преобразуется в значение целевого типа, который должен быть также числовым. Для преобразования вещественных типов точность результата лежит в пределах точности заданного подтипа (см. 4.5.7). Преобразование значения вещественного типа в значение целого типа состоит в его округлении до ближайшего целого; для вещественного операнда, равноотстоящего от двух целых (с точностью этого вещественного подтипа), округление может быть произведено как в ту, так и в другую сторону.
б. Производные типы. Преобразование допустимо, если целевой тип и тип операнда являются производными один от другого, непосредственно или косвенно, или если существует третий тип, от которого производными являются тип операнда и целевой тип, непосредственно или косвенно. в. Индексируемые типы. Преобразование допустимо, если тип опвранда и целевой тип — индексируемые типы, которые удовлетворяют следующим условиям: обв типа должны иметь одну и ту же размерность; в каждой позиции индекса типы индексов должны быть либо одинаковыми, либо взаимопреобразуемыми; типы компонент должны быть одинаковыми; наконец, если тип компоненты — тип с дискриминантами или ссылочный тип, то подтипы компонент должны быть оба либо ограниченными, либо неограниченными.
Если обозначение типа задает неограниченный индексируемый тип, то для каждой позиции индекса границы результата преобразования определены преобразованием границ операнда в значения соответствующего типа индекса це. левого типа. Если обозначение типа задает ограниченный индексируемый тип, то границы результата совпадают с границами, укаэанными в обозначении типа. В обоих случаях значение каждой компоненты результата определяется соответствующей компонентой операнда (см. 4.5.2). При вычислении преобразований числовых и производных типов возбуждается исключе. ние СОНВТЙА(НТ ЕЙЙОЙ, если результат преобразования не удовлетворяет заданным в обо.
значении типа ограничениям. При преобразовании индексируемых типов проверяется тот факт, что любое ограничение подтипв компоненты одинаково для индексируемого типа операнда и для целевого индексн. руемого типа. Если обозначение типа задает неограниченный индексируемый тип и если опе. Плаза 4 Примеры преобразования числовых типов: ВЕАЦ2 ' 3) — — значение преобразуется к плавающему типу )НТЕОЕВ(1.6) — — значение равно 2 )НТЕОЕВ( — 0.4) — — значение равно 0 Примеры преобразования производных типов: 1тре А КОНМ Ь пме 8 ЕОНМ; Х: А СОНМ; У: 8 ЕОНМ; Х;= А ГОВМ(У); у:= 8 ЕОВМ(Х); — обратное преобразование Примеры преобразования индексируемых типов: 1ТРе ЗЕОЦЕМСЕ )э аязу НМТЕОЕВ гаере <>) е) )МТЕОЕН: млзцме 002ЕН Ь ЗЕООЕМСЕ(1 ..
12); ЬЕООЕН: зпау(1 .. 100) е! !МТЕОЕВ; ЗЕОЦЕНСЕ(ЬЕООЕН) — с границами как у ьеооен зеооемсе(ьеООен(31 .. 428 — с границами 31 — 42 002ем(ееобен(31 .. 420 -- с границами как у 002ен Примеры неявных преобразований: Х: !МТЕОЕВ:= 2; Х + 1 + 2 1+2+Х Х + (1 + 2) неявное преобразование каждого целого литерала неявное преобразование каждого целого литерала — — неявное преобразование каждого целого литерала ранд не является пустым массивом, то дпя каждои позиции индекса проверяется принадпеж.
ность границ результата соответствующему подтипу индекса целевого типа. Если обозначение типа задает ограниченный индексируемый подтип, то для каждой компоненты операнда про. веряется наличие соответствующей компоненты целевого подтипа, и наоборот. Если хотя бы одна из этих проверок дает отрицатепьныи результат, возбуждается исключение СОМЗТВА))ЧТ ЕВВОВ.
Если допустимо преобразование одного типа в другой, то также допустимым является и обратное преобразование. Это обратное преобразование используется тогда, когда фактическии параметр вида 1и ом) или ои) имеет форму преобразования типа имени (переменной), как это поясняется в равд. 6.4.1. Единственной допустимой формой неявного преобразования типа является преобразование значения универсального целого или универсального вещественного типов в значение другого числового типа. Неявное преобразование операнда универсального целого типа в другой целый тип или операнда универсального вещественного типа в другой вещественный тип возможно только для операнда, являющегося либо числовым литералом, либо именованным числом, либо атрибутом; в этом разделе такой операнд называется преобразуемым универсальным операндом.
Неявное преобразование преобразуемого универсального операнда применимо тогда и только тогда, когда самыи сложный полный контекст (см. 8.7) определяет единственный (числовой) целевой тип дпя этого неявного преобразования и, кроме этого преобразования, не существует иной, предписаннои языком правильной интерпретации этого контекста.
Примечание. Правила для неявных преобразований подразумевают, что для операнда явно. го преобразования типа не производится никаких неявных преобразовании. Аналогично не производится никаких неявных преобразований для операндов предопределенных операций отношения, являющихся преобразуемыми универсальными операндами.
Для индексируемых типов в языке допускается неявное преобразование подтипов (см. 5.2.1). Последствием явного преобразования типа может быть изменение представления (в частности, см. 13.6). Явные преобразования используются также для фактических параметров (см. 6.4). 353 Имаев и еы жеиия 2=(1 41) тип — универсальный целый неявных преобразований нет то же, что и выше то же, что и выше неявное преобразование 3, но не 1 и 2 А'ЕЕМВТН ж В'!.ЕМОТН С: сопв1ап(:= 3 + 2 Х = 3 апд 1 = 2 Ссылки: атрибут 4.1.4, базовый тип 3.3, вещественный тип 3.5.6, вид 6.1, возбуждение исключений 11, выражение 4.4, именованное число 3.2, имя 4.1, индекс 3.6, индексируемый тип 36, исключение СОМВТВА)МЕО ЕНВОН 11.1, компонента 3.3, неограниченный индексируемый тип 3.6, обозначение типа 3.3.2, ограниченный индексируемый подтип 3.6, оператор 5, переменная 3.2.1, плавающий тип 3.5.7, подтип 3.3, подтип индекса 3.6, представление 13.1, принадлежать подтипу 3.3, производный тип 3.4, пустой массив 3.6.1, размерность 3.6, сопоставленная компонента 4.5.2, тип З.З, тип индекса 3.6, универсальный вещественный тип 4.5.6, универсальный целый тип 3.5.4, фактический параметр 6.4.1, целый тип 3.5.4, числовой литерал 2.4, числовой тип 3.5.
4.7. КВАЛИФИЦИРОВАННЫЕ ВЫРАЖЕНИЯ Квалифицированное выражение используется для явного указания типа и, возможно, подтипа операнда, заданного выражением или агрегатом. квалифицированное выражение:: = обозначение типа' (выражение] ! обозначение типа'агрегат Тип операнда должен совпадать с базовым типом обозначения типа.
Значение квалифицированного выражения — это значение операнда. Вычисление квалифицированного выражения выдает операнд и проверяет, принадлежит ли его значение подтипу, заданному в обозначении типа. При отрицательном результате проверки возбуждается исключение СОМЯТВА(МТ ЕННОН. Примеры: гуре МАЯК 1 ° (НХ, ОЕС, ЕХР, Я)ОМ(р)1 гуре СООЕ ( ° (НХ, С1А, ОЕС. ТМЕ, 606)1 Ря!Мт (мАЯк'(оес)); — оес типа мАяк Резнт (сбое'(Оеф)1 — Оес типа сООе Примечание. Когда тип литерала перечисления или агрегата неизвестен из контекста, квалифицированное выражение может быть использовано для явного установления типа. Например, совмещенный литерал перечисления должен быть квалифицирован в следующих случаях: при использовании его в качестве параметра в вызове совмещенной подпрограммы, которая не может быть идентифицирована на основе типов остальных параметров и типа результата; в отношении, в котором оба операнда — совмещенные литералы перечисления; в массиве или диапазоне параметра цикла, в которых обе границы — совмещенные литералы перечисления.