Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
#1

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

01.07.2012, 20:13. Просмотров 3769. Ответов 14
Метки нет (Все метки)

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 не было перехода?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2012, 20:13
Ответы с готовыми решениями:

Объявление внутри switch
Почему, когда закомментирваны фигурные скобки не получается объявить переменную...

Объявление переменных в С++
Начал изучение С++ и возник такой вопрос как повторно производить действия с...

Объявление переменных
Добрый вечер.Подскажите,пожалуйста,не могу разобраться.Непонятно,почему в...

объявление переменных
вообщем есть задание которое не раз тут обсуждалось решалось и тд. суть не в...

Объявление переменных
Пишу на VS2012. Перерыл кучу сайтов, но нигде не нашел, как объявить переменную...

14
Евгений89
99 / 99 / 39
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 20:33 #2
А там и не будет ошибки,у тебя к икс присваивается 2 и потом происходит выход из цикла, если ты хотел выбрать из двух один то поставь перед swich(choise) cin>> choise;
а точнее к иксу присваиваеется 2 потом идет вывод на экран потом выход из цикла. по этому отображается только цифра 2
0
Leomana
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
01.07.2012, 20:34 #3
C++
1
case 1: {int x; x = 1; break;}
при таком описании тоже ошибка..
1
Евгений89
99 / 99 / 39
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 20:45 #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;
}
0
Leomana
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
01.07.2012, 20:57 #5
видимо во втором случае компилятор "не додумался", что в case 1 можно и не попасть, и выделил память на x
1
Евгений89
99 / 99 / 39
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 21:04 #6
у него просто выбора не было он полюбому бы туда попал)))))))))

Добавлено через 2 минуты
switch как и if созданы для того что бы можно было сделать выбор из чего либо , я же скинул правильный код
0
Leomana
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
01.07.2012, 21:04 #7
Цитата Сообщение от Евгений89 Посмотреть сообщение
у него просто выбора не было он полюбому бы туда попал)))))))))
в смысле по любому туда попал? Вы о чем?
0
Евгений89
99 / 99 / 39
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 21:08 #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;
 }
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.07.2012, 21:11 #9
Евгений89, чукча не читатель. Чукча писатель.
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему во втором случае нет ошибки компиляции? Как происходит объявление x, если по метке case 1 не было перехода?
Нельзя одновременно объявлять и инициализировать переменную в case блоке. Можно засунуть в {}, но будет другая ошибка(см ниже)
Объявляя переменную в одном блоке case вы делаете ее доступной для всех последующих case. Если засунуть в {}, то область видимости ограничится фигурными скобками.
1
Leomana
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
01.07.2012, 21:14 #10
во первых я написала про case 1, во вторых окончательно все равно неизвестно куда он может попасть.. да и потом, я думаю, автор знает как написать правильно, и ему было интересно почему так работает, а так нет ... ИМХО
1
Евгений89
99 / 99 / 39
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 21:28 #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 был за фигурными скобками тогда бы была ошибка необъявленной переменной
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
01.07.2012, 21:30 #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;
   }
1
Евгений89
99 / 99 / 39
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 21:33 #13
ну я то это знаю )))))))))
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
02.07.2012, 07:54  [ТС] #14
Цитата Сообщение от soon Посмотреть сообщение
Объявляя переменную в одном блоке case вы делаете ее доступной для всех последующих case.
Да, я уже понял, что происходит именно так. Просто это выглядит немного нелогичным, да и в книжке Липпмана вот прочитал, что так объявлять переменные нельзя (возможно ошибка в переводе). А оказалось объявлять можно, но нельзя инициализировать, хм.
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.07.2012, 19:19 #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
1
02.07.2012, 19:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2012, 19:19

Объявление переменных.
У меня есть два юнита с формами. В одном располагается TMainMenu, где я выбираю...

Объявление переменных
Помогите с объявлением переменных, даны такие объявления: int m1; int *m2;...

Объявление глобальных переменных
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; void main (int...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru