
Либо при желании значение ch можно было бы оставить неизменным и использовать toupper (ch) в качестве условия проверки:
Сводка: выбор из множества вариантов с помощью оператора switch Ключевое слово
switch
Общий комментарий
Поток управления программы переходит к метке case, содержащей значение конструкции выражение. Затем программа выполняет все оставшиеся операторы, если только управление снова не будет перенаправлено посредством оператора break. Как выражение, так и метки case должны иметь целочисленные значения (включая тип char), а метки должны быть константами или выражениями, состоящими только из констант. Если ни одна из меток case не совпадает со значением выражения, управление передается оператору, помеченному как default, если таковой предусмотрен. В противном случае управление переходит к оператору, следующему за switch.
Форма
switch(toupper(ch)) switch (выражение)
{
case метка! : оператор1 || используйте break, чтобы пропустить все
// операторы до конца switch
case метка2 : оператор2 default : операторЗ
}
Помеченных операторов может быть более двух, а случай default является необязательным. Пример
switch (choice)
{
case 1 :
Управляющие операторы С: ветвление и переходы 283
case 2 : printf("Великолепно!\n"); break;
case 3 : printf("Совершенно верно!\n" );
case 4 : printf("На все сто!\n"); break;
default : printf("Удачного дня.\n");
}
Если переменная choice имеет целое значение 1 или 2, выводится первое сообщение, если
3 — второе и третье сообщения. (Управление переходит на следующий оператор, поскольку
после case 3 не указан оператор break.) Если значение choice равно 4, то выводится третье сообщение. Другие значения приводят к выводу только последнего сообщения.
Операторы switch И if else
Когда должен применяться оператор switch, а когда конструкция if else? Часто выбор попросту отсутствует. Оператор switch нельзя использовать, если выбор основан на значении переменной или выражения с плавающей запятой. Точно гак же применять оператор switch затруднительно, если переменная должна входить в определенный диапазон. Написать следующий код просто:
if (integer < 1000 && integer > 2)
К сожалению, охват этого диапазона посредством оператора switch предполагает установку меток case для каждого целого числа в промежутке от 3 до 999. В то же время, когда есть возможность использовать switch, программа зачастую выполняется немного быстрее и имеет более компактный вид.
Оператор goto
Оператор goto, своего рода оплот ранних версий языков BASIC и FORTRAN, доступен и в С. Тем не менее, в отличие от BASIC и FORTRAN, язык С вполне может обойтись без этого оператора. Керниган и Ритчи отзываются об операторе goto как о потенциальном источнике ошибок и советуют применять его как можно реже или вообще не применять. Сначала мы объясним, как использовать goto, а затем покажем, что обычно в нем нет нужды.
Оператор goto состоит из двух частей — ключевое слово goto и имя метки. Именование меток производится по тому же соглашению, которое применяется для имен переменных,например:
goto part2;
Для корректной работы этого оператора в программе должен присутствовать другой оператор, снабженный меткой part2. Это делается путем помещения перед оператором имени метки с двоеточием:
part2: printf("Уточненный анализ:\n");
избегайте goto
В принципе в программе С никогда не возникает потребность в goto, но если ваш опыт программирования основан на языке FORTRAN или BASIC, где этот оператор обязателен, то вполне возможно, что использование goto вошло в привычку. Чтобы помочь вам избавиться от этой зависимости, мы рассмотрим несколько знакомых случаев применения goto и продемонстрируем подход к их решению, характерный для языка С.
284 глава 7
• Поддержка ситуации с оператором if, требующей выполнения более одного оператора:
if (size > 12) goto а; goto b;
a: cost = cost * 1.05; flag = 2;
b: bill = cost * flag;
В ранних версиях BASIC и FORTRAN к оператору if относился только один оператор, непосредственно следующий за условием. Не было никаких средств для реализации блоков или составных операторов. Ниже приведен эквивалент этой структуры на языке С. Стандартный для С подход с использованием составного оператора или блока существенно облегчает понимание программы: if (size > 12)
{
cost = cost * 1.05; flag = 2;
}
bill = cost * flag;
• Выбор из двух альтернатив:
if (ibex > 14) goto a; sheds = 2; goto b; a: sheds = 3; b: help = 2 * sheds;
Наличие в С структуры if else позволяет выразить выбор более ясно:
Читать дальше