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

Оператор switch - C++

Восстановить пароль Регистрация
 
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
09.09.2012, 18:14     Оператор switch #1
Ниже приведены три примера (1 и 2 работают, а 3 почему-то не работает). Говорит, что пропуск инициализации? Почему тогда 1 и 2 работают, а 3 нет?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//main
 
int a = 2;
 
switch(a){
 case 1:
    int b;
    b= 2;
    break;
 case 2:
    break;
 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//main
 
int a = 2;
 
switch(a){
 case 1:
   {
       int b = 2
   }
    break;
 case 2:
    break;
 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//main
 
int a = 2;
 
switch(a){
 case 1:
    int b = 2;
 
    break;
 case 2:
    break;
 
}
Добавлено через 33 минуты
up....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 18:14     Оператор switch
Посмотрите здесь:

Cи++. Оператор switch. C++
C++ С++.Оператор switch.
Оператор switch C++
Оператор switch C++
C++ Оператор switch
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13989 / 8820 / 1230
Регистрация: 24.12.2010
Сообщений: 15,976
09.09.2012, 18:22     Оператор switch #2
Ты, видимо, работаешь в чистом C. А там переменные объявлять можно только в начале блока.
Кстати, при выходе из switch твоя b в любом случае потеряется
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
09.09.2012, 18:27  [ТС]     Оператор switch #3
Цитата Сообщение от Байт Посмотреть сообщение
Ты, видимо, работаешь в чистом C. А там переменные объявлять можно только в начале блока.
Кстати, при выходе из switch твоя b в любом случае потеряется
Я работаю в чистом C++. Ошибка выдаётся только в последнем пункте, говорит, пропуск инициализации. Остальные работают. Попробуйте у себя так сделать (3 пункт).
Что получится?
Байт
 Аватар для Байт
13989 / 8820 / 1230
Регистрация: 24.12.2010
Сообщений: 15,976
09.09.2012, 18:35     Оператор switch #4
Цитата Сообщение от Байт Посмотреть сообщение
переменные объявлять можно только в начале блока.
Это понятно?

Цитата Сообщение от bgm313 Посмотреть сообщение
Попробуйте у себя так сделать (3 пункт).
А зачем? Я и так вижу, что это ошибка
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
09.09.2012, 18:38  [ТС]     Оператор switch #5
......

Добавлено через 3 минуты
Цитата Сообщение от Байт Посмотреть сообщение
переменные объявлять можно только в начале блока.
В C++ переменные объявляются где-угодно внутри блока.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,196
Завершенные тесты: 1
09.09.2012, 18:44     Оператор switch #6
Дело в том, что если нет фигурных скобок (как во втором примере),
то компилятору непонятна область действия переменной b.
Вот он и матерится.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
09.09.2012, 18:48  [ТС]     Оператор switch #7
Цитата Сообщение от zss Посмотреть сообщение
Дело в том, что если нет фигурных скобок (как во втором примере),
то компилятору непонятна область действия переменной b.
Вот он и матерится.
А 1 пример почему тогда работает?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.09.2012, 18:49     Оператор switch #8
Цитата Сообщение от zss Посмотреть сообщение
Дело в том, что если нет фигурных скобок (как во втором примере),
то компилятору непонятна область действия переменной b.
Вот он и матерится.
Да всё там понятно: от определения до конца свитча насквозь через все кейсы.

Матерится он, потому что не знает, куда пристроить инициализацию этой переменной и что делать, если не дай бог прыжок будет на case 2 — ожидается ли инициализация или нет. Потому что он её с одной стороны должен выполнять, потому что переменная видна, а с другой стороны нет, потому что мы на этот код не прыгали. Поэтому во избежание тупых ошибок от жонглирования кейсами он считает это ошибкой. В первом случае всё ясно: не выполнять, это явно написано. Во втором она вообще в своём личном блоке и не видна в других кейсах.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2012, 19:20     Оператор switch
Еще ссылки по теме:

Оператор switch C++
C++ Оператор switch C++
Оператор switch C++ C++

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

Или воспользуйтесь поиском по форуму:
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.09.2012, 19:20     Оператор switch #9
приведи весь код случаев первого и последнего (со вторым вме и так ясно). первый случай кажется тоже некомпилируемым.

Добавлено через 25 минут
вот такое нашел объяснение:

The C++ standard says (C++03 §6.7):

It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps(77) from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer (8.5).

(*) The transfer from the condition of a switch statement to a case label is considered a jump in this respect.
Yandex
Объявления
09.09.2012, 19:20     Оператор switch
Ответ Создать тему
Опции темы

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