Оператор SWITCH дает специальный способ выбора одного измногих вариантов, который заключается в проверке совпадениязначения данного выражения с одной из заданных констант исоответствующем ветвлении. В главе 1 мы привели программуподсчета числа вхождений каждой цифры, символов пустых про-межутков и всех остальных символов, использующую последова-тельность IF...ELSE IF...ELSE. Вот та же самая программа спереключателем. MAIN() /* COUNT DIGITS,WHITE SPACE, OTHERS */{ INT C, I, NWHITE, NOTHER, NDIGIT[10]; NWHITE = NOTHER = 0; FOR (I = 0; I < 10; I++) NDIGIT[I] = 0; WHILE ((C = GETCHAR()) != EOF) SWITCH (C) { CASE '0': CASE '1': CASE '2': CASE '3': CASE '4': CASE '5': CASE '6': CASE '7': CASE '8': CASE '9': NDIGIT[C-'0']++; BREAK; CASE ' ': CASE '\N': CASE '\T': NWHITE++; BREAK; DEFAULT : NOTHER++; BREAK; } PRINTF("DIGITS ="); FOR (I = 0; I < 10; I++) PRINTF(" %D", NDIGIT[I]); PRINTF("\NWHITE SPACE = %D, OTHER = %D\N", NWHITE, NOTHER); Переключатель вычисляет целое выражение в круглых скоб-ках (в данной программе - значение символа с) и сравниваетего значение со всеми случаями (CASE). Каждый случай долженбыть помечен либо целым, либо символьной константой, либоконстантным выражением. Если значение константного выраже-ния, стоящего после вариантного префикса CASE, совпадает созначением целого выражения, то выполнение начинается с этогослучая. Если ни один из случаев не подходит, то выполняетсяоператор после префикса DEFAULT. Префикс DEFAULT являетсянеобязательным ,если его нет, и ни один из случаев не подхо-дит, то вообще никакие действия не выполняются. Случаи и вы-бор по умолчанию могут располагаться в любом порядке. Всеслучаи должны быть различными. Оператор BREAK приводит к немедленному выходу из перек-лючателя. Поскольку случаи служат только в качестве меток,то если вы не предпримите явных действий после выполненияоператоров, соответствующих одному случаю, вы провалитесь наследующий случай. Операторы BREAK и RETURN являются самымобычным способом выхода из переключателя. Как мы обсудимпозже в этой главе, оператор BREAк можно использовать и длянемедленного выхода из операторов цикла WHILE, FOR и DO. Проваливание сквозь случаи имеет как свои достоинства,так и недостатки. К положительным качествам можно отнестито, что оно позволяет связать несколько случаев с одним дей-ствием, как было с пробелом, табуляцией и новой строкой внашем примере. Но в то же время оно обычно приводит к необ-ходимости заканчивать каждый случай оператором BREAK, чтобыизбежать перехода к следующему случаю. Проваливание с одногослучая на другой обычно бывает неустойчивым, так как оносклонно к расщеплению при модификации программы. За исключе-нием, когда одному вычислению соответствуют несколько меток,проваливание следует использовать умеренно. Заведите привычку ставить оператор BREAK после последне-го случая (в данном примере после DEFAULT), даже если это неявляется логически необходимым. В один прекрасный день, ког-да вы добавите в конец еще один случай, эта маленькая мерапредосторожности избавит вас от неприятностей. Упражнение 3-1 -------------- Напишите программу для функции EXPAND(S, T), которая ко-пирует строку S в т, заменяя при этом символы табуляции иновой строки на видимые условные последовательности, как \Nи \т. используйте переключатель.