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

5.4 Операторы выбора

Оператор case_statement выбирает для выполнения один из нескольких альтернативных sequences_of_statements; выбранная альтернатива определяется значением выражения.

Синтаксис

case_statement ::=
case выбирающее_выражение is
case_statement_alternative
{case_statement_alternative}
end case;
case_statement_alternative ::=
when список_дискретных_значений =>
последовательность_операторов

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

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

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

Выражения выбора, указания подтипов и диапазоны, заданные как дискретное_значение оператора case_statement, должны быть статическими. Ключевое слово others, если оно присутствует, должно стоять в списке дискретных_значений последним.
Возможные значения выбирающего_выражения должны быть покрыты (см. 3.8.1) следующим образом:
  • Если выбирающее_выражение является идентификатором (включая преобразование типа, квалифицированное выражение или вызов функции) со статическим и ограниченным номинальным подтипом, то каждое дискретное_значение (кроме others) должно покрывать только те значения в этом подтипе, которые удовлетворяют его предикатам (см. 3.2.4), и каждое значение этого подтипа, удовлетворяющее его предикатам, должно быть покрыто каким-либо дискретным_значением (явным образом или с помощью others).
  • Если тип выбирающего_выражения является целым типом или потомком формального скалярного типа, то оператор case_statement должен иметь дискретное_значение others.
  • В противном случае каждое значение базового диапазона типа выбирающего_выражения должно быть покрыто (явным образом или с помощью others).
Два различных дискретных_значения оператора case_statement не должны покрывать одно и то же значение.

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

При выполнении оператора case_statement, выбирающее_выражение оценивается в первую очередь.
Если значение выбирающего_выражения покрыто список_дискретных_значений некоторой case_statement_alternative, тогда последовательность_операторов этой альтернативы выполняется.
В противном случае (значение не покрыто ни одним список_дискретных_значений, возможно, из-за выхода за пределы базового диапазона), возникает исключение Constraint_Error.
ПРИМЕЧАНИЕ Выполнение оператора case_statement выбирает только одну альтернативу. Квалификация выражения оператора case_statement статическим подтипом часто используется для ограничения количества явно заданных вариантов.

Примеры

Примеры операторов case:
case Sensor is
when Elevation => Record_Elevation(Sensor_Value);
when Azimuth => Record_Azimuth (Sensor_Value);
when Distance => Record_Distance (Sensor_Value);
when others => null;
end case;
case Today is
when Mon => Compute_Initial_Balance;
when Fri => Compute_Closing_Balance;
when Tue .. Thu => Generate_Report(Today);
when Sat .. Sun => null;
end case;
case Bin_Number(Count) is
when 1 => Update_Bin(1);
when 2 => Update_Bin(2);
when 3 | 4 =>
Empty_Bin(1);
Empty_Bin(2);
when others => raise Error;
end case;


Spec-Zone.ru

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