Язык С

Переключатель


Оператор 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 и \т. используйте переключатель.



    Содержание раздела