С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
1

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

25.05.2016, 09:52. Показов 4897. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему, когда закомментирваны фигурные скобки не получается объявить переменную внутри 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2016, 09:52
Ответы с готовыми решениями:

Объявление переменных внутри блока switch
#include &lt;iostream&gt; int main() { int choice = 2; switch(choice) { ...

Объявление объекта внутри функции
Здраствуйте. У меня такой вопрос: есть класс class A { public: A(): p1(p2),p2(new int)...

Объявление переменной внутри цикла while
Доброго времени суток, форумчане. Расскажите нубу, что происходит при объявлении объявленной...

gets внутри switch
Подскажите, почему не получается осуществить gets для ввода char внутри данной конструкции: do ...

8
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
25.05.2016, 10:05 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;
0
0 / 0 / 3
Регистрация: 24.10.2015
Сообщений: 6
25.05.2016, 15:58 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, следовательно мы обходим объявления переменных со всеми вытекающими...
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.05.2016, 16:08 4
Цитата Сообщение от zelhat Посмотреть сообщение
где переменная с инициализатором вышла из области видимости
Как что-то может выйти из области видимости в case, если:
Цитата Сообщение от DrOffset Посмотреть сообщение
Метка case не вносит области видимости же
0
0 / 0 / 3
Регистрация: 24.10.2015
Сообщений: 6
25.05.2016, 16:31 5
C++
1
2
3
4
5
6
case true:
    int j = 0;
    int i = 0;
    break;
case false:
    i = j;
Если бы данный код был допустим, переход ко второму case обходит инициализацию j и i, они остаются в области видимости и код их может вполне себе использовать. Но они не инициализированны. В результате язык не допускает перепрыгивать инициализацию, если инициализированная переменная находится в области видимости в пункте, к которому переходит управление.

0
Вездепух
Эксперт CЭксперт С++
12793 / 6670 / 1795
Регистрация: 18.10.2014
Сообщений: 16,889
25.05.2016, 16:36 6
Цитата Сообщение от Knjagskij Посмотреть сообщение
Почему, когда закомментирваны фигурные скобки не получается объявить переменную внутри switch?
Никаких проблем с объявлением как таковым в этом случае нет. Язык С++ запрещает "прыжки" в область видимости переменной, которые "перепрыгивают" инициализацию. Вот такой код компилироваться не будет

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

Прыжки через неинициализированные объявления - разрешены. Если вы в вашем коде замените int g = 8; на раздельное int g; g = 8;, то он будет компилироваться в обоих вариантах (со всеми вытекающими).
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
25.05.2016, 16:50 7
TheCalligrapher, а есть выдержки с стандарта по вашим тезисам разрешены/не разрешены ?
0
0 / 0 / 3
Регистрация: 24.10.2015
Сообщений: 6
25.05.2016, 17:11 8
switch statement
http://en.cppreference.com/w/cpp/language/switch
0
Вездепух
Эксперт CЭксперт С++
12793 / 6670 / 1795
Регистрация: 18.10.2014
Сообщений: 16,889
25.05.2016, 17:32 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/quest... 0#19830820
1
25.05.2016, 17:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2016, 17:32
Помогаю со студенческими работами здесь

Ругань на объявление массива внутри класса
Задание: создать класс-контейнер, реализующий политику FIFO. Имею код: CQueue.h #ifndef...

Пропуск условия if внутри switch
В общем я как-то подвис, и не могу взять в толк в чем проблема.В свитче по сути if должен же...

Внутри switch ошибка Case bypasses initialization of a local variable
Компилятор не устраивает case 3, там ввод массива автоматически , в чем ошибка подскажите Ошибку...

Switch case внутри switch case
Привет всем! Нужна помощь. Пишу калькулятор с консольным меню. Так вот, используется цикл...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru