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

Объявление внутри switch - C++

Восстановить пароль Регистрация
 
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 772
Завершенные тесты: 1
25.05.2016, 09:52     Объявление внутри switch #1
Почему, когда закомментирваны фигурные скобки не получается объявить переменную внутри switch?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    switch (bool b = true) {
    case true:
    //{
        int g = 8;
        cout << g;
        break;
    //}
    default:
        break;
    }
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Игорь1986
34 / 98 / 24
Регистрация: 08.09.2014
Сообщений: 844
Завершенные тесты: 1
25.05.2016, 10:05     Объявление внутри switch #2
Кто тебе такое сказал
C++
1
2
3
4
5
 case true:
    {
        int g = 8;
        cout << g;}
        break;
А по твоему вопросу смотри синтаксис
C++
1
2
3
4
5
6
7
 switch (bool b = true) {
    case true:
        int g = 8;
        cout << g;
        break;
}
    return 0;
zelhat
0 / 0 / 1
Регистрация: 24.10.2015
Сообщений: 6
25.05.2016, 15:58     Объявление внутри switch #3
Выполнение оператора switch способно переходить через метки case. Когда выполнение переходит к некой метке case, весь расположенный выше код оператора switch будет проигнорирован. Что будет, если пропущен код с объявленной переменной?
Поэтому, недопустим переход с места, где переменная с инициализатором вышла из области видимости к месту, где эта переменная находится в области видимости.
C++
1
2
3
4
5
6
7
case true:
    int j = 0;
    int i = 0;
    break;
case false:
    i = 1;       // ок в области видимости
    j = 1;       // ок в области видимости
если данный код будет доступен, и мы пропускаем секцию true, следовательно мы обходим объявления переменных со всеми вытекающими...
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
25.05.2016, 16:08     Объявление внутри switch #4
Цитата Сообщение от zelhat Посмотреть сообщение
где переменная с инициализатором вышла из области видимости
Как что-то может выйти из области видимости в case, если:
Цитата Сообщение от DrOffset Посмотреть сообщение
Метка case не вносит области видимости же
zelhat
0 / 0 / 1
Регистрация: 24.10.2015
Сообщений: 6
25.05.2016, 16:31     Объявление внутри switch #5
C++
1
2
3
4
5
6
case true:
    int j = 0;
    int i = 0;
    break;
case false:
    i = j;
Если бы данный код был допустим, переход ко второму case обходит инициализацию j и i, они остаются в области видимости и код их может вполне себе использовать. Но они не инициализированны. В результате язык не допускает перепрыгивать инициализацию, если инициализированная переменная находится в области видимости в пункте, к которому переходит управление.

TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2902 / 1438 / 397
Регистрация: 18.10.2014
Сообщений: 2,652
25.05.2016, 16:36     Объявление внутри switch #6
Цитата Сообщение от Knjagskij Посмотреть сообщение
Почему, когда закомментирваны фигурные скобки не получается объявить переменную внутри switch?
Никаких проблем с объявлением как таковым в этом случае нет. Язык С++ запрещает "прыжки" в область видимости переменной, которые "перепрыгивают" инициализацию. Вот такой код компилироваться не будет

C++
1
2
3
goto label;
int i = 8;
label:;
именно потому, что в объявлении переменной присутствует инициализатор. Именно по этой причине не компилируется и ваш switch: метка default: прыгает в область видимости переменной g, но перепрыгивает инициализацию этой переменной. Дополнительные фигурные скобки устраняют проблему.

Прыжки через неинициализированные объявления - разрешены. Если вы в вашем коде замените int g = 8; на раздельное int g; g = 8;, то он будет компилироваться в обоих вариантах (со всеми вытекающими).
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2135 / 968 / 223
Регистрация: 30.11.2013
Сообщений: 3,239
25.05.2016, 16:50     Объявление внутри switch #7
TheCalligrapher, а есть выдержки с стандарта по вашим тезисам разрешены/не разрешены ?
zelhat
0 / 0 / 1
Регистрация: 24.10.2015
Сообщений: 6
25.05.2016, 17:11     Объявление внутри switch #8
switch statement
http://en.cppreference.com/w/cpp/language/switch
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2016, 17:32     Объявление внутри switch
Еще ссылки по теме:

C++ Внутри switch ошибка Case bypasses initialization of a local variable
Пропуск условия if внутри switch C++
C++ While{switch{switch{break;}}} break выходит из while

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

Или воспользуйтесь поиском по форуму:
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2902 / 1438 / 397
Регистрация: 18.10.2014
Сообщений: 2,652
25.05.2016, 17:32     Объявление внутри switch #9
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а есть выдержки с стандарта по вашим тезисам разрешены/не разрешены ?
Разумеется

6.7 Declaration statement
...
3 It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A
program that jumps91 from a point where a variable with automatic storage duration is not in scope to a
point where it is in scope is ill-formed unless the variable has scalar type, class type with a trivial default
constructor and a trivial destructor, a cv-qualified version of one of these types, or an array of one of the
preceding types and is declared without an initializer.
...
91) The transfer from the condition of a switch statement to a case label is considered a jump in this respect.
---------------

P.S. Если кому-то будет интересно на досуге, я в свое время отвечал на аналогичный вопрос на SO, где также шла речь об определенных отличиях между С и С++. Язык С разрешает прыжки через инициализацию, однако в С аналог оригинального кода без скобок тоже не будет компилироваться, но совсем по другой, не связанной причине

http://stackoverflow.com/questions/9...30820#19830820
Yandex
Объявления
25.05.2016, 17:32     Объявление внутри switch
Ответ Создать тему
Опции темы

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