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

Объявление переменных внутри блока switch - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
01.07.2012, 20:13     Объявление переменных внутри блока switch #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
int main()
{
    int choice = 2;
    
    switch(choice)
    {
        //case 1: int x = 1; break;   // ошибка
        case 1: int x; x = 1; break; // почему нет ошибки?
        case 2: x = 2; std::cout << x; break;
    }
     
    return 0;
}
Почему во втором случае нет ошибки компиляции? Как происходит объявление x, если по метке case 1 не было перехода?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2012, 20:13     Объявление переменных внутри блока switch
Посмотрите здесь:

Объявление переменных. C++
C++ gets внутри switch
C++ Объявление переменных
C++ объявление переменных
Объявление переменных в С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 20:33     Объявление переменных внутри блока switch #2
А там и не будет ошибки,у тебя к икс присваивается 2 и потом происходит выход из цикла, если ты хотел выбрать из двух один то поставь перед swich(choise) cin>> choise;
а точнее к иксу присваиваеется 2 потом идет вывод на экран потом выход из цикла. по этому отображается только цифра 2
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.07.2012, 20:34     Объявление переменных внутри блока switch #3
C++
1
case 1: {int x; x = 1; break;}
при таком описании тоже ошибка..
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 20:45     Объявление переменных внутри блока switch #4
x заранее объяви

Добавлено через 3 минуты
как то так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
 
using namespace std;
int main()
{
    int choice;
    int x;
    cin >>choice; 
    switch(choice)
    {
        //case 1: int x = 1; break;   // ошибка
    case 1:
        x = 1;
        break; // почему нет ошибки?
     case 2:
        x = 2;
        cout << x;
        break;
    }
     
    return 0;
}
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.07.2012, 20:57     Объявление переменных внутри блока switch #5
видимо во втором случае компилятор "не додумался", что в case 1 можно и не попасть, и выделил память на x
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 21:04     Объявление переменных внутри блока switch #6
у него просто выбора не было он полюбому бы туда попал)))))))))

Добавлено через 2 минуты
switch как и if созданы для того что бы можно было сделать выбор из чего либо , я же скинул правильный код
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.07.2012, 21:04     Объявление переменных внутри блока switch #7
Цитата Сообщение от Евгений89 Посмотреть сообщение
у него просто выбора не было он полюбому бы туда попал)))))))))
в смысле по любому туда попал? Вы о чем?
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 21:08     Объявление переменных внутри блока switch #8
он у тебя не выбирает а сразу целенаправленно идет на case 2 вот так должно быть:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
 using namespace std;
 int main()
 {
 int choice;
 int x;
 cin >>choice; 
 switch(choice)
 {
 case 1:
   x = 1;
   cout << x;
   break;
 
 case 2:
 x = 2;
 cout << x;
 break;
 }
 return 0;
 }
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.07.2012, 21:11     Объявление переменных внутри блока switch #9
Евгений89, чукча не читатель. Чукча писатель.
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему во втором случае нет ошибки компиляции? Как происходит объявление x, если по метке case 1 не было перехода?
Нельзя одновременно объявлять и инициализировать переменную в case блоке. Можно засунуть в {}, но будет другая ошибка(см ниже)
Объявляя переменную в одном блоке case вы делаете ее доступной для всех последующих case. Если засунуть в {}, то область видимости ограничится фигурными скобками.
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.07.2012, 21:14     Объявление переменных внутри блока switch #10
во первых я написала про case 1, во вторых окончательно все равно неизвестно куда он может попасть.. да и потом, я думаю, автор знает как написать правильно, и ему было интересно почему так работает, а так нет ... ИМХО
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 21:28     Объявление переменных внутри блока switch #11
можно, только зачем тебе это

во такой код тебе похоже нужен

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
int main()
{
    int choice;
    cin >>choice; 
    switch(choice)
    {
       
    case 1:
        { int x = 1;
        cout << x;
        break;
        }
     case 2:
        
        { int x = 2;
        cout << x;
        break;
        }
    }
     
    return 0;
}
Добавлено через 10 минут
у тебя оба кейса в фигурных скобках, и объявление х у тебя в фигурных скобках , во если бы у тебя case 2 был за фигурными скобками тогда бы была ошибка необъявленной переменной
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
01.07.2012, 21:30     Объявление переменных внутри блока switch #12
Тот вариант, что работает, равносилен вот этому:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
   switch( choice ) {
      int x;
      
      case 1:
         x = 1;
         std::cout << x;
         break;
         
      case 2:
         x = 2;
         std::cout << x;
         break;
   }
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 21:33     Объявление переменных внутри блока switch #13
ну я то это знаю )))))))))
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
02.07.2012, 07:54  [ТС]     Объявление переменных внутри блока switch #14
Цитата Сообщение от soon Посмотреть сообщение
Объявляя переменную в одном блоке case вы делаете ее доступной для всех последующих case.
Да, я уже понял, что происходит именно так. Просто это выглядит немного нелогичным, да и в книжке Липпмана вот прочитал, что так объявлять переменные нельзя (возможно ошибка в переводе). А оказалось объявлять можно, но нельзя инициализировать, хм.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2012, 19:19     Объявление переменных внутри блока switch
Еще ссылки по теме:

Объявление переменных C++
Объявление переменных C++
C++ Объявление и инициализация переменных

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

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.07.2012, 19:19     Объявление переменных внутри блока switch #15
Цитата Сообщение от Schizorb Посмотреть сообщение
Да, я уже понял, что происходит именно так. Просто это выглядит немного нелогичным
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
 
int main()
{
    int choice = 2;
    
    /*switch(choice)
    {
        //case 1: int x = 1; break;   // ошибка
        case 1: int x; x = 1; break; // почему нет ошибки?
        case 2: x = 2; std::cout << x; break;
    }*/
    if(choice == 1)
        goto C1;
    else if(choice == 2)
        goto C2;
    else
        goto END;
    {
    C1:
        int x;
        x = 1;
        goto END;
    C2:
        x = 2;
        goto END;
    }
END:
 
    return 0;
}
А теперь?
Цитата Сообщение от Schizorb Посмотреть сообщение
А оказалось объявлять можно, но нельзя инициализировать, хм.
Стандарт, 6.7.3
Yandex
Объявления
02.07.2012, 19:19     Объявление переменных внутри блока switch
Ответ Создать тему
Опции темы

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