Справочник Ada 2005
5.4 Оператор выбора
Оператор case_statement выбирает для выполнения один из ряда альтернативных sequences_of_statements; выбранная альтернатива определяется значением выражения.
Синтаксис
case_statement ::=
case выражение is
альтернатива_операторa_выбора
{альтернатива_операторa_выбора}
end case;
case выражение is
альтернатива_операторa_выбора
{альтернатива_операторa_выбора}
end case;
Правила разрешения имен
Ожидается, что выражение будет иметь дискретный тип. Ожидаемый тип для каждого выбора — это тип выражения.
Правила легальности
Выражения и диапазоны, заданные как выборы оператора case_statement, должны быть статическими. Выбор others, если он присутствует, должен стоять один и в последнем список_значений.
Возможные значения выражения должны быть покрыты следующим образом:
- Если выражение является именем (включая преобразование_типов или вызов_функции), имеющим статический и ограниченный номинальный подтип, или является квалифицированным_выражением, чья метка_подтипа обозначает статический и ограниченный скалярный подтип, то каждый выбор выбора без others должен охватывать только значения в этом подтипе, и каждое значение этого подтипа должно быть покрыто каким-либо выбором (явно или с помощью others).
- Если тип выражения является целым_типом, универсальным_целым_типом или потомком формального скалярного типа, то оператор case_statement должен иметь выбор others.
- В противном случае, каждое значение базового диапазона типа выражения должно быть покрыто (явно или с помощью others).
Два разных выбора оператора case_statement не должны покрывать одно и то же значение.
Динамическая семантика
Для выполнения оператора case_statement выражение вычисляется в первую очередь.
Если значение выражения покрыто список_значений какой-либо альтернативы case_statement_alternative, то последовательность_операторов данной альтернативы выполняется.
В противном случае (значение не покрыто ни одним список_значений, возможно, из-за того, что оно находится за пределами базового диапазона), генерируется исключение Constraint_Error.
ПРИМЕЧАНИЯ
4 Выполнение оператора case_statement выбирает только одну альтернативу. Квалификация выражения оператора case_statement с помощью статического подтипа часто используется для ограничения числа явных вариантов выбора.
Примеры
Примеры операторов выбора:
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;
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;
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;
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;