Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Nikitko_Cent
143 / 113 / 12
Регистрация: 27.10.2011
Сообщений: 685
Завершенные тесты: 3
#1

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

21.11.2012, 11:11. Просмотров 339. Ответов 5
Метки нет (Все метки)

Сел позавчера за изучение плюсов, изучаю по книжке В.В.Подбельского
В этой книжке приведён пример использования конструкции 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? Блин вообще ничего не пойму, объясните пожалуйста
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 11:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструкция switch - магия какая-то (C++):

Конструкция SWITCH - C++
Как с помощью switch cоеденить вот эти две программы #include&lt;iostream.h&gt; #include&lt;conio.h&gt; void main() { int...

Оптимальная конструкция switch-case-while / while-switch-case - C++
Имеется конструкция типа: switch() { case 1: while() { ... }

Оптимизируется ли компилятором конструкция switch-case? Работа со строками через ID объекта или hash - C++
Добрый вечер, 1) Определён ли порядок выбора switch (согласно стандарта кажись неопределён, но все компиляторы я уверен в этом...

Найти какая из двух заданных точек ближе к третьй, вывести найденное расстояние (использовать оператор switch) - C++
Помогите написать программу на С++. Не пойму как реализовать в этой задаче switch. На числовой оси расположены три точки: A, B, C....

Массивы, магия - C++
Есть код: #include &lt;iostream&gt; #include &lt;cstdlib&gt; int main(void) { int yams; yams = 7; yams =...

Магия отладчика - C++
Доброго времени суток! Возник такой вопрос: я использую среду разработки code::blocks 16.01 с компилятором mingw, и при просмотре того, как...

5
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
21.11.2012, 11:14 #2
Делайте break; в каждой секции case (где нужно закончить выполнение switch).
в switch выполняется код, начиная с найденной секции (в вашем случае 4) и до первого break; (или до конца switch)
0
diagon
21.11.2012, 11:17
  #3

Не по теме:

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

0
Croessmah
21.11.2012, 11:22
  #4

Не по теме:

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

0
SatanaXIII
Супер-модератор
Эксперт С++
5619 / 2654 / 247
Регистрация: 01.11.2011
Сообщений: 6,553
Завершенные тесты: 1
21.11.2012, 11:29 #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-а.
1
Nikitko_Cent
143 / 113 / 12
Регистрация: 27.10.2011
Сообщений: 685
Завершенные тесты: 3
21.11.2012, 11:38  [ТС] #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'ы в любом случае
0
21.11.2012, 11:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2012, 11:38
Привет! Вот еще темы с ответами:

Магия OpenMP - C++
Есть такой код: Expr = ... // vector&lt;pair&lt;size_t, double&gt;&gt; #ifdef _OPENMP #pragma omp parallel num_threads( 2==(size_level-ptr) ? 1...

Магия виртуального деструктора - C++
Если убрать определение virtual (стр. 18), то вызывается (47) только деструктор класса Person (деструктор Student не вызывается). Вопрос:...

Магия со статическими массивами - C++
Предисловие: на форуме подняли топик http://www.cyberforum.ru/cpp-beginners/thread1065365.html , в голове сразу мелькнула мысль...

Строки char и магия - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; int main(void) { cout &lt;&lt; &quot;Vvedite...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru