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

Почему в switch нельзя определять переменные? - C++

Восстановить пароль Регистрация
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
21.07.2013, 14:27     Почему в switch нельзя определять переменные? #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int n;
 
    std::cout << "Введите число: ";
    std::cin >> n;
 
    switch (n)
    {
        case 1:     int i=5;  break;
        case 2:     double x=3.14;  break;  // пропуск инициализации "i" из-за метки "case"
    }
 
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Discoverer
16 / 14 / 2
Регистрация: 05.07.2013
Сообщений: 27
21.07.2013, 14:30     Почему в switch нельзя определять переменные? #2
C++
1
2
3
4
5
 switch (n)
    {
        case 1:    { int i=5;  break; }
        case 2:     double x=3.14;  break;
    }
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11809 / 6788 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
21.07.2013, 14:31     Почему в switch нельзя определять переменные? #3
Заключите коды каждой ветки в фигурные скобки.
C++
1
case ...{int x; ... ;break;}
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
21.07.2013, 14:38  [ТС]     Почему в switch нельзя определять переменные? #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Заключите коды каждой ветки в фигурные скобки.
и все таки из-за чего эта ошибка? пропуск инициализации "i" из-за метки "case"
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 14:43     Почему в switch нельзя определять переменные? #5
Поясню.
C++
1
2
3
4
5
    switch (n)
    {
        case 1:     int i=5;  break;
        case 2:     double x=3.14;  break;
    }
Переменные i и x находятся в одной области видимости, и, если n==2, получится что i не будет определена, вопреки здравому смыслу.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.07.2013, 15:55     Почему в switch нельзя определять переменные? #6
Попробую объяснить более понятно - если бы это было разрешено, то такой код считался бы валиндым
C++
1
2
3
4
5
    switch (n)
    {
        case 1:     int i=5;  break;
        case 2:     ++i;  break;
    }
при n == 2 где-то бы умер один маленький котенок
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
21.07.2013, 17:36  [ТС]     Почему в switch нельзя определять переменные? #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
при n == 2 где-то бы умер один маленький котенок
почему умер?! наоборот, родился бы (++i)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2013, 09:12     Почему в switch нельзя определять переменные?
Еще ссылки по теме:

Почему нельзя подставлять переменные в выражения #if #else? C++
C++ почему не видет switch?
C++ Символьные переменные и оператор switch

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
22.07.2013, 09:12     Почему в switch нельзя определять переменные? #8
Очень интересно. Область видимости у нас ограничена скобочками при switch, но при этом внутри них выполнится только то, что начинается с case. Это я к тому, что хоть и борландовый компилятор это хавает, но пишет предупреждение о недостижимости кода. Тогда как если сразу объявить и проинициализировать переменную, то уже выдает ошибку.
C++
1
2
3
4
5
6
7
8
9
int n = 1;
switch(n)
  {
  int x = 0; // Ошибка
  int t;  // Ништяк
  t = 0;  // Ништяк
  case 1 : {int i=5;  ShowMessage(t);} break;
  case 2 : n++; break;
  }
ShowMessage покажет мусор. То есть не ноль. Но при этом не заругается, так как переменная объявлена.
Yandex
Объявления
22.07.2013, 09:12     Почему в switch нельзя определять переменные?
Ответ Создать тему
Опции темы

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