Инструкция switch (язык С)

Формат:

switch(<выражение>) <инструкция>

Выражение должно быть целого типа.

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

switch(<выражение>){

case <постоянное выражение>:[case<пост. выражение>:]... [<инструкция>]

[case <пост. выражение>:[case<пост. выражение>:]... [<инструкция>]]…

[default: <инструкция>]

}

Под постоянным понимается выражение, не содержащее переменных. Это выражение должно быть целого типа. Пока будем рассматривать в этом качестве целые(символьные тоже!) литералы. Постоянное выражение часто также называют меткой из-за его функционального назначения.

Схема выполнения инструкции следующая.

1. Вычисляется выражение в инструкции switch. Его иногда называют тестовым.

2. Выполняется проверка на равенство значения тестового выражения и значений меток в предложениях caseв порядке их следования в теле инструкции switch.

3. Как только такая метка будет найдена, управление передается инструкции, следующей за ней.

4. Если не произойдет совпадение значения ни с одной из меток case, управление передается инструкции за меткой default, если она присутствует.

5. Если такой ветви нет, то управление передается инструкции, следующей за инструкцией switch, т.е. тело ее просто пропускается.

Правила и рекомендации.

1. Предложения case и default могут записываться в произвольном порядке, однако рекомендуется располагать так, как показано выше.

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

3. Метки не влияют на порядок выполнения следующих инструкций, т.е. если в процессе выполнения switch будет выбрана 1 из ветвей case, то продолжится выполнение инструкций последующих ветвей caseили default. Если необходимо прекратить выполнение после какой-либо ветви, следует использовать инструкцию break, которая передаст управление инструкции, следующей за switch.

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

5. Значения меток в теле switch должны быть уникальными, поскольку управление передается в первую по записи ветвь, метка которой совпадет с тестовым значением. Следовательно, переход в другую ветвь с такой же меткой физически недостижим.

Пример. Дан символьный массив {xi}, i=1...30. Подсчитать количество символов разрядки, цифр (каждой по отдельности) и остальных символов.

for(i=0; i<10; i++)digit[ i ]=0; // Массив для подсчета "вхождений" каждой цифры

for(empty=other=i=0; i<30; i++){

switch(x[i]){

case '0': case '1': case'2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': digit[x[ i ]-'0']++; break;

case ' ': case '\n': case '\t':empty++; break;

default: other++; [break;]

}

}

5.8.2. Инструкция select case (язык Basic)

Формат:

select [case] <тестовое выражение>
case <список выражений>

[<инструкции>]
[
case <список выражений>

[<инструкции>]]...
[
case else

[<инструкции>]

]

end select

<список выражений>:=<выражение>[,<выражение>]...

<выражение>:={<выражение>|<выражение> to <выражение>|is <оператор сравнения><выражение>}

<оператор сравнения>:={>|>=|<|<=|=|<>}

Правила и рекомендации.

1. Тестовое выражение – числовое или строчное выражение.

2. Предложение case else аналогично предложению default в языке C.

3. Выражения в теле инструкции могут быть произвольными (допустимы переменные) в отличие от языка C.

4. Метка типа <выражение> проверяется на точное сравнение с тестовым значением.

5. Метка типа <выражение> to <выражение> представляет собой замкнутый диапазон значений, при попадании в который тестового значения выполняется переход на соответствующую ветвь, например, 5 to 10.

6. Метка типа is <оператор сравнения><выражение> есть открытый диапазон допустимых значений, например, is < MaxSize. Ключевое слово is может опускаться. После завершения инструкции case или case elseоно будет вставлено перед оператором сравнения.

7. В отличие от языка C при попадании управления на какую-либо ветвь инструкции выполняются до следующего предложения case или end select, а не переходят дальше.

8. Ключевое слово case в инструкции select может опускаться.

Пример. Тот же.

for i=0 to 9

digit( i )=0