Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования 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; // количество сантиметров

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4