Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
}
}
switch
архаичен, но он намного яснее вложенных инструкций if
, особенно если необходимо сравнить значение со многими константами. Значение, указанное в скобках после ключевого слова switch
, сравнивается с набором констант. Каждая константа представлена как часть метки case
. Если значение
case
, то выбирается инструкция из данного раздела case
. Каждый раздел case завершается ключевым словом break
. Если значение не соответствует ни одной метке case
, то выбирается оператор, указанный в разделе default
. Этот раздел не обязателен, но желателен, чтобы гарантировать перебор всех альтернатив. Если вы еще не знали, то знайте, что программирование приучает человека сомневаться практически во всем. 4.4.1.3. Технические подробности инструкции switch
Здесь под техническими подробностями подразумеваются следующие детали, касающиеся инструкции
switch
. 1. Значение, которое определяет выбор варианта, должно иметь тип
int
, char
или enum
(см. раздел 9.5). В частности, переключение по строке произвести невозможно. 2. Значения меток разделов
case
должны быть константными выражениями (см. раздел 4.3.1). В частности, переменная не может быть меткой раздела case
. 3. Метки двух разделов
case
не должны иметь одинаковые значения. 4. Один раздел
case
может иметь несколько меток. 5. Не забывайте, что каждый раздел
case
должен завершаться ключевым словом break
. К сожалению, компилятор не предупредит вас, если вы забудете об этом. Рассмотрим пример.
int main // переключение можно производить только по целым
// числам и т.п.
{
cout << "Вы любите рыбу?\n";
string s;
cin >> s;
switch (s) { // ошибка: значение должно иметь тип int,
// char или enum
case " нет ":
// ...
break;
case " да ":
// ...
break;
}
}
Для выбора альтернатив по строке следует использовать инструкцию
if
или ассоциативный массив (подробнее об этом речь пойдет в главе 21). Инструкция switch
генерирует оптимизированный код для сравнения значения с набором констант. Для крупных наборов констант он обычно создает более эффективный код по сравнению с коллекцией инструкций if
. Однако это значит, что значения меток разделов case
должны быть разными константами.
int main // метки разделов case должны быть константами
{
// определяем альтернативы:
int y = 'y'; // это может создать проблемы
const char n = 'n';
const char m = '?';
cout << "Вы любите рыбу ?\n";
char a;
cin >> a;
switch (a) {
case n:
// ...
break;
case y: // ошибка: переменная метка раздела case
// ...
break;
case m:
// ...
break;
case 'n': // ошибка: дубликат метки раздела case
// (значение метки n равно 'n')
// ...
break;
default:
// ...
break;
}
}
Часто для разных значений инструкции
switch
целесообразно выполнить одно и то же действие. Было бы утомительно повторять это действие для каждой метки из этого набора. Рассмотрим пример.
int main // одна инструкция может иметь несколько меток
{
cout << "Пожалуйста, введите цифру \n";
char a;
cin >> a;
switch (a) {
case '0': case '2': case '4': case '6': case '8':
cout << " четная \n";
break;
case '1': case '3': case '5': case '7': case '9':
cout << " нечетная \n";
break;
default:
cout << " не цифра \n";
break;
}
}
switch
, программисты забывают завершить раздел case
ключевым словом break
. Рассмотрим пример.
int main // пример плохой программы (забыли об инструкции break)
{
const double cm_per_inch = 2.54; // количество сантиметров
Поделиться:
Популярные книги
На распутье
2. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
Идеальный мир для Лекаря 15
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Гром над Академией Часть 3
4. Гром над миром
Фантастика:
фэнтези
5.25
рейтинг книги
Попаданка в Измену или замуж за дракона
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Проданная невеста
Любовные романы:
любовно-фантастические романы
5.80
рейтинг книги
Лорд Системы
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Вторая жизнь майора. Цикл
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Сердце Дракона. Том 12
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Уязвимость
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Имя нам Легион. Том 4
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Безумный Макс. Ротмистр Империи
2. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
4.67
рейтинг книги
Наследница Драконов
2. Наследница Драконов
Любовные романы:
современные любовные романы
любовно-фантастические романы
6.81
рейтинг книги
Вечный. Книга III
3. Вечный
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Дурашка в столичной академии
Фантастика:
фэнтези
7.80