Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2021, 01:30   #1
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
По умолчанию Оператор Switch, провалы в программе.

Переход последовательности операторов, связанных с одной ветвью case, в следующую ветвь case считается ошибкой, поскольку в С# должно непременно соблюдаться правило недопущения "провалов" в передаче управления ходом выполнения
программы. Именно поэтому последовательность операторов в каждой ветви case
оператора switch оканчивается оператором break. (Избежать подобных "провалов",
можно также с помощью оператора безусловного перехода goto, рассматриваемого
далее в этой главе, но для данной цели чаще применяется оператор break.) Когда
128 Часть I. Язык C#
в последовательности операторов отдельной ветви case встречается оператор break,
происходит выход не только из этой ветви, но из всего оператора switch, а выполнение программы возобновляется со следующего оператора, находящегося за пределами оператора switch. Последовательность операторов в ветви default также должна
быть лишена "провалов", поэтому она завершается, как правило, оператором break.
Правило недопущения "провалов" относится к тем особенностям языка С#, которыми он отличается от С, C++ и Java. В этих языках программирования одна ветвь
case может переходить (т.е. "проваливаться") в другую. Данное правило установлено
в C# для ветвей case по двум причинам. Во-первых, оно дает компилятору возможность свободно изменять порядок следования последовательностей операторов из ветвей case для целей оптимизации. Такая реорганизация была бы невозможной, если
бы одна ветвь case могла переходить в другую. И во-вторых, требование завершать
каждую ветвь case явным образом исключает непроизвольные ошибки программирования, допускающие переход одной ветви case в другую.
Несмотря на то что правило недопущения "провалов" не допускает переход одной
ветви case в другую, в двух или более ветвях case все же разрешается ссылаться с помощью меток на одну и ту же кодовую последовательность, как показано в следующем
примере программы.

Вопрос: объясните простым языком что такое "провалы" в программе. Если не сложно приведите пример, можно на примере кода с пометками в каком именно месте кода образуется провал.
P.S Из прочитанного материала смутное представление о провале в программе.

Последний раз редактировалось bITA666; 28.03.2021 в 01:35.
bITA666 вне форума Ответить с цитированием
Старый 28.03.2021, 01:35   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Код:
int y = 10, x;
switch (y)
{
    case 10:
        x = 20;
        // проваливание
    case 20:
        x = 40;
        break;
    default:
        x = 0;
        break;
}
Пример на Си. Значение x после такого свитча будет 40, так как произойдет проваливание из "case 10" в "case 20".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.03.2021, 08:01   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 980
По умолчанию

на современных стандартах C++ компилятор выдаст предупреждение о провале. Подавить его можно так

Код:
#include <iostream>

int main()
{
    int y = 10, x{};
    switch (y)
    {
        case 10:
        {
            x = 20;
        }
        [[fallthrough]];//без этого компилятор выдаст предупреждение

        case 20:
        {
            x = 40;
        }break;
        
        default:
        {
            x = 0;
        }break;
    }
}
Алексей1153 вне форума Ответить с цитированием
Старый 28.03.2021, 10:58   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,566
По умолчанию

А не лишним ли будет break в блоке default ? Ведь всё равно, как говорил Гамлет, дальше - тишина, т.е. переход на следующий оператор. Или для красоты единообразия ?
digitalis вне форума Ответить с цитированием
Старый 28.03.2021, 11:08   #5
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 980
По умолчанию

digitalis, с моей точки зрения - нет, не лишний )
Алексей1153 вне форума Ответить с цитированием
Старый 28.03.2021, 11:15   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,566
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
... с моей точки зрения - нет, не лишний )
А объективно ?
digitalis вне форума Ответить с цитированием
Старый 28.03.2021, 11:29   #7
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 980
По умолчанию

digitalis, хорошая читаемость - это объективно или субъективно?
Алексей1153 вне форума Ответить с цитированием
Старый 28.03.2021, 12:38   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,566
По умолчанию

Таки - да. Но с кочки зрения компилятора - монофигственно
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оператор switch XeniaZharinova C# (си шарп) 4 07.12.2014 20:19
C++ оператор SWITCH Ramina Помощь студентам 10 05.02.2012 19:32
switch оператор Alex-Kunfuman Общие вопросы C/C++ 28 22.01.2012 04:42
C++ оператор switch Pingvinenok_Lolo Помощь студентам 4 05.12.2011 23:11
Оператор switch. IgorArhangel Помощь студентам 4 16.01.2009 01:53