13.2.2 Оператор Case

Вверх  Предыдущий  Следующий

Free Pascal поддерживает оператор case (выбора). Его синтаксическая схема


Оператор Выбора (Case)

1310

1311

1312


Константы, в различных частях case (альтернатив) должны быть известны во время компиляции, и могут быть следующих типов: перечисления, порядкового типа (за исключением логического (boolean)), и символьного или строкового типа. Выражение (после служебного слова case) должно быть такого типа, или произойдет ошибка компиляции. Все индексы case должны иметь одинаковый тип.

Компилятор подсчитает выражение (после служебного слова case). Если одно из значений индекса case совпадает со значением выражения, выполняется оператор следующий за константой. После этого программа продолжает выполняться после end оператора case.

Если ни один из case индексов не соответствует значению выражения, выполняется список инструкций после ключевых слов else или otherwise. Это может быть и пустой список операторов. Если отсутствует else часть и ни один case индекс не соответствует значению выражения, программа продолжает выполняться после end оператора case.

В операторе case могут быть составные операторы (то есть блоки begin..end).

Примечание:

В отличие от Turbo Pascal, дублирование case индекса не допускаются в Free Pascal, поэтому следующий код вызовет ошибку компиляции:

Var i : integer;

...

Case i of

3 : DoSomething;

1..5 : DoSomethingElse;

end;

Компилятор выдаст ошибку Duplicate case label (Продублирован case индекс) при компиляции этого, потому что 3 также появляется (неявно) в диапазоне 1..5. Это дублирует синтаксис Delphi.

Free Pascal позволяет использовать строки в качестве индексов case, и в этом случае case переменная (или выражение) также должна быть строкой. При использовании переменной строкового типа в case и различные индексы сравниваются с учётом регистра.

Case lowercase(OS) of

windows’,

dos   : WriteLn ('Платформа Microsoft');

macos’,

darwin : Writeln('Платформа Apple');

linux’,

freebsd’,

netbsd : Writeln('Общественная платформа');

else

WriteLn ('Другая платформа');

end;

Case со строками эквивалентна последовательности операторов if then else, при этом никаких оптимизаций не выполняются.

Тем не менее, диапазоны допустимы, и эквивалентны

if (value >= beginrange) and (value <= endrange) then

begin

end;