Без break выполнялись бы все операторы между тем, который имеет совпадающую метку, и концом switch. Например, если вы удалите все операторы break, а затем запустите программу и введете букву в, будет получен следующий вывод:
Дайте мне букву алфавита, и я укажу вам название животного, начинающееся с этой буквы.
Введите букву или # для завершения, в [enter]
выхухоль, водоплавающее существо ехидна, игольчатый муравьед рыболов, светло-коричневая куница Вопрос озадачил!
Введите следующую букву или # для завершения.
# [enter]
Программа завершена.
Были выполнены все операторы, начиная с case 'в' : и до конца оператора
switch.
Кстати, break работает и с циклами и с оператором switch, в то время как continue — только с циклами. С другой стороны, continue может применяться внут-
280 Глава 7 ри оператора switch, если switch находится в цикле. В такой ситуации, как и с другими циклами, continue заставляет программу пропустить остальные операторы цикла, включая другие части switch.
Если вы знакомы с языком Pascal, то можете отметить большое сходство switch с оператором case в Pascal. Самое важное различие между ними связано с тем, что switch требует использования оператора break, если нужно, чтобы выполнялся только помеченный оператор. Кроме того, в конструкции case языка С нельзя применять диапазон.
Проверочное выражение в круглых скобках внутри switch должно иметь целочисленное значение (включая тип char). Метки case должны быть константами целочисленного типа (в том числе char) или целочисленными константными выражениями (выражениями, которые содержат только целочисленные константы). Указывать для метки case переменную не допускается. Ниже приведена структура оператора switch.
switch {целочисленное-выражение)
{
case константа1:
операторы <- не обязательно
case константа2\
операторы <- не обязательно
default: <- не обязательно
операторы <- не обязательно
}
Чтение только первого символа строки
Еще одна новая особенность программы animals. с связана с тем, как она читает входные данные. Возможно, вы уже заметили во время выполнения этой программы, что при вводе вап был обработан только первый символ. Такое поведение с отбрасыванием оставшейся части строки часто является желательным в интерактивных программах, ожидающих односимвольные ответы. Указанное поведение обеспечивает следующий код:
while (getchar() != '\n')
continue; /* пропустить оставшуюся часть входной строки */
Этот цикл читает символы из входной последовательности вплоть до символа новой строки, генерируемого нажатием клавиши , включительно. Обратите внимание, что возвращаемое значение getchar() не присваивается переменной ch, поэтому программа просто читает символы и отбрасывает их. Так как последним отброшенным будет символ новой строки, то очередной подлежащий чтению символ будет первым символом следующей строки. Функция getchar() считывает его и присваивает переменной ch во внешнем цикле while.
Предположим, что пользователь начинает с нажатия , так что первым прочитанным оказывается символ новой строки. Следующий код учитывает эту возможность:
if (ch == ‘\n')
continue;
Множество меток
В операторе switch можно использовать множество меток case, как показано в листинге 7.12.
Управляющие операторы С: ветвление и переходы 281
Листинг 7.12. Программа vowels. с

Если ch содержит, скажем, букву i, оператор switch переходит в место, помеченное как case 1i ' :. Поскольку с этой меткой не связан оператор break, управление переходит к следующему оператору, которым является i_ct++,*. Если значение ch равно I, управление переходит прямо на этот оператор. В сущности, обе метки ссылаются на один и тот же оператор.
Строго говоря, оператор break для case * U' не нужен, т.к. благодаря его отсутствию управление в программе перемещается на следующий оператор внутри switch, которым является break для случая default. Следовательно, break для case ' U' можно было убрать, тем самым сократив код. С другой стороны, если позже будут добавляться другие случаи, то наличие оператора break там, где он должен быть, позволит не забыть о необходимости его добавления.
Ниже показан пример выполнения программы:
Введите текст или # для завершения программы.
I see under the overseer.#
Количество гласных: А Е I О U
0 7 111
282 Глава 7
В рассматриваемом случае можно избежать множества меток за счет применения функции toupper() из семейства ctype.h (см. табл. 7.2), преобразовав перед провер кой условия все строчные буквы в прописные:
Читать дальше