Форум программистов, компьютерный форум CyberForum.ru

Конструкция switch - магия какая-то - C++

Восстановить пароль Регистрация
 
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
21.11.2012, 11:11     Конструкция switch - магия какая-то #1
Сел позавчера за изучение плюсов, изучаю по книжке В.В.Подбельского
В этой книжке приведён пример использования конструкции switch. Сама суть программы состояла в выведении названий все нечётных цифр, не меньших заданной
Я приведу укороченный код без ввода данных и т.п.:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int ic;
 
    ic=4;
 
    switch (ic)
    {
        case 0: case 1: cout << "one, ";
        case 2: case 3: cout << "two, ";
        case 4: case 5: cout << "five, ";
        case 6: case 7: cout << "seven, ";
        case 8: case 9: cout << "nine. ";
                                   break;
    }
при ic=4 программа выводит на экран "five, seven, nine. " Вроде бы всё работает, но одно непонятно - КАК ЭТО РАБОТАЕТ!?!?

Вот почему выводит на экран "five," почему "seven," и почему "nine. " ведь тогда получается что сравнивания case 5 , case 7 , case 9 возвращают true? Блин вообще ничего не пойму, объясните пожалуйста
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 11:11     Конструкция switch - магия какая-то
Посмотрите здесь:

Строки char и магия C++
Магия виртуального деструктора C++
Магия со статическими массивами C++
C++ Магия при компиляции больших проектов
C++ Массивы, магия
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
21.11.2012, 11:14     Конструкция switch - магия какая-то #2
Делайте break; в каждой секции case (где нужно закончить выполнение switch).
в switch выполняется код, начиная с найденной секции (в вашем случае 4) и до первого break; (или до конца switch)
diagon
21.11.2012, 11:17
  #3

Не по теме:

Странный код, впрочем, с таким автором это не удивительно. У нас этот человек преподает C#, и между делом часто говорит какую-то ересь про плюсы.

Croessmah
21.11.2012, 11:22
  #4

Не по теме:

Цитата Сообщение от diagon Посмотреть сообщение
Странный код, впрочем, с таким автором это не удивительно. У нас этот человек преподает C#, и между делом часто говорит какую-то ересь про плюсы.
Он отступник!!! Повесьте его

SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
21.11.2012, 11:29     Конструкция switch - магия какая-то #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну. Все просто:
Разберем пошагово конструкцию
C++
1
case 4: case 5: cout << "five, ";
Так как у нас в условии задачи "нечетную цифру не меньше заданной", то четную (4) меньшую (4<5) мы пропускаем. (за этим они и в одной строке) Когда мы доходим до записи:
C++
1
case 4:
, которая у нас истинна, а следовательно все после нее выполняется до конца switch-a или break-а, вот и после нее все идущее начинает выполняться. А следом идет проверка
C++
1
case 5:
, на которую нам пофигу, так как она не конец switch-a и не break. Следовательно все далее выполняется.

А в первые строки
C++
1
2
        case 0: case 1: cout << "one, ";
        case 2: case 3: cout << "two, ";
тупа не заходим, так как не выполняется сравнение case-а.
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
21.11.2012, 11:38  [ТС]     Конструкция switch - магия какая-то #6
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ну. Все просто:
Разберем пошагово конструкцию
C++
1
case 4: case 5: cout << "five, ";
Так как у нас в условии задачи "нечетную цифру не меньше заданной", то четную (4) меньшую (4<5) мы пропускаем. (за этим они и в одной строке) Когда мы доходим до записи:
C++
1
case 4:
, которая у нас истинна, а следовательно все после нее выполняется до конца switch-a или break-а, вот и после нее все идущее начинает выполняться. А следом идет проверка
C++
1
case 5:
, на которую нам пофигу, так как она не конец switch-a и не break. Следовательно все далее выполняется.

А в первые строки
C++
1
2
        case 0: case 1: cout << "one, ";
        case 2: case 3: cout << "two, ";
тупа не заходим, так как не выполняется сравнение case-а.
Всё, разобрался, спасибо, я то думал будут проверяться все case'ы в любом случае
Yandex
Объявления
21.11.2012, 11:38     Конструкция switch - магия какая-то
Ответ Создать тему
Опции темы

Текущее время: 01:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru