Spec-Zone.ru › Ada 2022
Справочник по Ada (Ada 2022)

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 условного выражения conditional_expression должно иметь тип T. Аналогично, если ожидается, что условное выражение conditional_expression будет иметь какой-либо класс типов, то каждое зависимое выражение dependent_expression условного выражения conditional_expression должно удовлетворять тому же ожиданию. Если условное выражение conditional_expression должно иметь тип T, то каждое зависимое выражение dependent_expression должно иметь тип T.
Возможные типы условного выражения conditional_expression определяются следующим образом:
  • Если условное выражение conditional_expression является операндом преобразования типа, тип условного выражения conditional_expression — целевой тип преобразования; в противном случае,
  • Если все зависимые выражения dependent_expression имеют один и тот же тип, тип условного выражения conditional_expression — это тип; в противном случае,
  • Если зависимое выражение dependent_expression имеет элементарный тип, тип условного выражения conditional_expression должен соответствовать этому типу; в противном случае,
  • Если условное выражение conditional_expression должно иметь тип T или должно иметь тип T, то условное выражение conditional_expression имеет тип T.
Условие condition должно иметь любой булевый тип.
Ожидаемый тип для selecting_expression и discrete_choices определяется так же, как и для операторов case (см. 5.4).

Правила допустимости

Все зависимые выражения dependent_expression должны быть преобразуемы (см. 4.6) к типу условного выражения conditional_expression.
Если ожидаемый тип условного выражения conditional_expression — конкретный помеченный тип, все зависимые выражения dependent_expression условного выражения conditional_expression должны быть динамически помечены, или ни одно из них не должно быть динамически помечено. В этом случае условное выражение conditional_expression является динамически помеченным, если все зависимые выражения dependent_expression динамически помечены, является неопределенным по меткам, если все dependent_expression неопределены по меткам, и является статически помеченным в противном случае.
Если нет else dependent_expression, выражение if_expression должно иметь булевый тип.
Все Правила допустимости, которые применяются к discrete_choices оператора case (см. 5.4), также применяются к discrete_choices выражения case_expression, за исключением случаев использования в экземпляре параметризованного блока.

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

При вычислении выражения if_expression условие, указанное после if, и любые условия, указанные после elsif, вычисляются последовательно (при этом окончательное else рассматривается как elsif True then), пока одно из них не станет истинным или все условия не будут вычислены и дадут ложное значение. Если условие вычисляется как истинное, соответствующее 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, и результат — значение выражения case_expression. В противном случае (значение не покрывается ни одним списком discrete_choice_list, возможно, из-за того, что оно находится за пределами базового диапазона), генерируется ошибка Constraint_Error.

Примеры

Пример использования if_expression:
Put_Line ("Кейси - " &
(if Casey.Sex = M then "Мужской" else "Женский")); -- см. 3.10.1
Пример использования case_expression:
function Card_Color (Card : Suit) return Color is -- см. 3.5.1
(case Card is
when Clubs | Spades => Черный,
when Hearts | Diamonds => Красный);


Spec-Zone.ru

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