Spec-Zone.ru › Ada 2012
Справочное руководство по Ada 2012

4.5.7 Условные выражения

Выражение conditional_expression выбирает для вычисления не более одного из вложенных выражений dependent_expression, в зависимости от решения среди альтернатив. Одним из типов выражения conditional_expression является выражение if_expression, которое выбирает для вычисления dependent_expression в зависимости от значения одного или нескольких соответствующих условий. Другим типом выражения conditional_expression является выражение case_expression, которое выбирает для вычисления одно из нескольких альтернативных выражений dependent_expression; выбранная альтернатива определяется значением выражения selecting_expression.

Синтаксис

conditional_expression ::= if_expression | case_expression
if_expression ::=
if condition then dependent_expression
{elsif condition then dependent_expression}
[else dependent_expression]
condition ::= boolean_expression
case_expression ::=
case selecting_expression is
case_expression_alternative {,
case_expression_alternative}
case_expression_alternative ::=
when discrete_choice_list =>
dependent_expression
В тех местах, где правила синтаксиса допускают использование выражения expression, может быть использовано условное выражение conditional_expression вместо него, при условии, что оно сразу окружено скобками.

Правила разрешения имен

Если ожидается, что условное выражение conditional_expression будет типа T, то каждое dependent_expression данного выражения ожидается типа T. Аналогично, если условное выражение conditional_expression должно принадлежать к какому-либо классу типов, то каждое dependent_expression выражения подвергается тем же ожиданиям. Если условное выражение conditional_expression должно разрешиться к типу T, то каждое dependent_expression должно разрешиться к типу T.
Возможные типы условного выражения conditional_expression определяются следующим образом:
  • Если условное выражение conditional_expression является операндом преобразования типа, тип условного выражения — целевой тип преобразования; в противном случае,
  • Если все dependent_expressionы имеют один и тот же тип, тип условного выражения — это тот тип; в противном случае,
  • Если dependent_expression имеет элементарный тип, тип условного выражения должен быть охвачен этим типом; в противном случае,
  • Если условное выражение conditional_expression ожидается типа T или должно разрешиться к типу T, то условное выражение имеет тип T.
Ожидаемый тип для selecting_expression и discrete_choices аналогичен случаям (см. 5.4).
Правила законности
Все dependent_expressionы должны быть преобразуемы (см. 4.6) к типу условного выражения conditional_expression.
Если ожидаемый тип условного выражения conditional_expression — конкретный помеченный тип, все dependent_expressionы условного выражения должны быть динамически помечены, или ни один не должен быть динамически помечен. В этом случае условное выражение динамически помечено, если все dependent_expressionы динамически помечены, является непомеченным, если все dependent_expressionы непомечены, и является статически помеченным в противном случае.
Если нет else dependent_expression, то выражение if_expression должно иметь булевый тип.
Все правила законности, которые применяются к discrete_choices оператора case_statement (см. 5.4), также применяются к discrete_choices выражения case_expression, за исключением использования в экземпляре генерирующего блока.

Динамические семантики

Для вычисления выражения if_expression, условие, указанное после if, и все условия, указанные после elsif, вычисляются последовательно (рассматривая конечный else как elsif True then), до тех пор, пока одно из них не даст значение True или все условия вычисляются и дают False. Если условие вычисляется до True, связанное dependent_expression вычисляется, преобразуется к типу выражения if_expression, и полученное значение становится значением выражения if_expression. В противном случае (если нет else-части), значение выражения if_expression равно True.
Для вычисления выражения case_expression, сначала вычисляется selecting_expression. Если значение selecting_expression охватывается discrete_choice_list некоторой case_expression_alternative, то dependent_expression соответствующей case_expression_alternative вычисляется, преобразуется к типу выражения case_expression, и полученное значение является значением выражения case_expression. В противном случае (значение не охвачено ни одной discrete_choice_list, возможно, из-за выхода за пределы базового диапазона), генерируется ошибка Constraint_Error.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API