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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
#1

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

21.07.2013, 14:27. Просмотров 584. Ответов 7
Метки нет (Все метки)

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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2013, 14:27     Почему в switch нельзя определять переменные?
Посмотрите здесь:

Почему таким способом нельзя создать массив? C++
C++ Почему нельзя компилировать отдельный заголовочный файл?
Почему нельзя использовать в операторе case переменные, которые определены как #define C++
C++ Почему нельзя так объявить двумерный массив?
Почему нельзя объявить динамический массив глобально C++
C++ Почему break нельзя использовать в if?
Почему нельзя подставлять переменные в выражения #if #else? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12536 / 7098 / 797
Регистрация: 27.09.2012
Сообщений: 17,517
Записей в блоге: 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
Эксперт С++
4870 / 3009 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 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
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 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 нельзя определять переменные?
Еще ссылки по теме:

C++ почему не видет switch?
C++ Символьные переменные и оператор switch
C++ Почему нельзя написать просто - using namespace boost;
C++ Почему два char нельзя сравнивать так ==?
C++ Почему нельзя выделить статически кусок в ~100 MB?

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5552 / 2586 / 235
Регистрация: 01.11.2011
Сообщений: 6,395
Завершенные тесты: 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 нельзя определять переменные?
Ответ Создать тему
Опции темы

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