netlib.narod.ru< Назад | Оглавление | Далее >

3.4. Инструкция switch

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

    switch (выражение) {
      case константа : инструкции
      case константа : инструкции
      default: инструкции
    }

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

В главе 1 мы написали программу, подсчитывающую число вхождений в текст каждой цифры, символов-разделителей (пробелов, табуляций и новых строк) и всех остальных символов. В ней мы использовали последовательность if...else if...else. Теперь приведем вариант этой программы с инструкцией switch:

/* Подсчет цифр, символов-разделителей и прочих символов */
#include <stdio.h>

main()
{
  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("Цифр :");
  for (i = 0; i < 10; i++)
    printf(" %d", ndigit[i]);
  printf(", разделителей : %d, других символов : %d\n",
          nwhite, nother);
  return 0;
}

Инструкция break вызывает немедленный выход из инструкции switch. Поскольку выбор ветви case реализуется как переход на метку, то после выполнения одной ветви case, если ничего не предпринять, программа будет выполнять следующую ветвь. Инструкции break и return — наиболее распространенные средства выхода из инструкции множественного ветвления. Инструкция break используется также для принудительного выхода из циклов while, for и do-while (мы еще поговорим об этом чуть позже).

«Сквозное» выполнение ветвей case вызывает смешанные чувства. С одной стороны, это хорошо, поскольку позволяет несколько ветвей case объединить в одну, как мы и поступили с цифрами в нашем примере. Но с другой — это означает, что в конце почти каждой ветви придется ставить break, чтобы избежать перехода к следующей. Последовательный проход по ветвям — вещь ненадежная, это чревато ошибками, особенно при изменении программы. За исключением случая с несколькими метками для одного вычисления, старайтесь по возможности реже пользоваться сквозным проходом, но если уж вы его применяете, обязательно комментируйте эти особые места.

Добрый вам совет: даже в конце последней ветви (после default в нашем примере) помещайте инструкцию break, хотя с точки зрения логики в ней нет никакой необходимости. Эта маленькая предосторожность спасет вас, когда однажды вам потребуется добавить в конец инструкции еще одну ветвь case.


Упражнение 3-2


Напишите функцию escape(s, t), которая при копировании текста из строки t в строку s преобразует такие символы, как новая строка и табуляция в видимые управляющие последовательности (вроде \n и \t). Используйте инструкцию switch. Напишите функцию, выполняющую обратное преобразование управляющих последовательностей в настоящие символы.



netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz