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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
#1

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

01.07.2012, 20:13. Просмотров 3131. Ответов 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 не было перехода?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2012, 20:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объявление переменных внутри блока switch (C++):

Объявление внутри switch - C++
Почему, когда закомментирваны фигурные скобки не получается объявить переменную внутри switch? int main() { switch (bool b =...

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

Объявление переменных - C++
Помогите с объявлением переменных, даны такие объявления: int m1; int *m2; int **m3; int m4; int *m5; int **m6; int (*m7); ...

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

Объявление переменных. - C++
У меня есть два юнита с формами. В одном располагается TMainMenu, где я выбираю как производится ввод: из файла или с клавиатуры, и могу...

Объявление переменных - C++
Пишу на VS2012. Перерыл кучу сайтов, но нигде не нашел, как объявить переменную в asm вставке? Добавлено через 53 минуты uuppp

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

Добавлено через 2 минуты
switch как и if созданы для того что бы можно было сделать выбор из чего либо , я же скинул правильный код
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.07.2012, 21:04 #7
Цитата Сообщение от Евгений89 Посмотреть сообщение
у него просто выбора не было он полюбому бы туда попал)))))))))
в смысле по любому туда попал? Вы о чем?
Евгений89
99 / 99 / 9
Регистрация: 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;
 }
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.07.2012, 21:11 #9
Евгений89, чукча не читатель. Чукча писатель.
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему во втором случае нет ошибки компиляции? Как происходит объявление x, если по метке case 1 не было перехода?
Нельзя одновременно объявлять и инициализировать переменную в case блоке. Можно засунуть в {}, но будет другая ошибка(см ниже)
Объявляя переменную в одном блоке case вы делаете ее доступной для всех последующих case. Если засунуть в {}, то область видимости ограничится фигурными скобками.
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.07.2012, 21:14 #10
во первых я написала про case 1, во вторых окончательно все равно неизвестно куда он может попасть.. да и потом, я думаю, автор знает как написать правильно, и ему было интересно почему так работает, а так нет ... ИМХО
Евгений89
99 / 99 / 9
Регистрация: 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 был за фигурными скобками тогда бы была ошибка необъявленной переменной
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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;
   }
Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
01.07.2012, 21:33 #13
ну я то это знаю )))))))))
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
02.07.2012, 07:54  [ТС] #14
Цитата Сообщение от soon Посмотреть сообщение
Объявляя переменную в одном блоке case вы делаете ее доступной для всех последующих case.
Да, я уже понял, что происходит именно так. Просто это выглядит немного нелогичным, да и в книжке Липпмана вот прочитал, что так объявлять переменные нельзя (возможно ошибка в переводе). А оказалось объявлять можно, но нельзя инициализировать, хм.
soon
2540 / 1305 / 81
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2012, 19:19
Привет! Вот еще темы с ответами:

объявление переменных - C++
вообщем есть задание которое не раз тут обсуждалось решалось и тд. суть не в этом. столкнулся с маленькой проблемой при оформлении каждого...

Объявление глобальных переменных - C++
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; void main (int x, int y) { printf (&quot;x=&quot;); scanf_s (&quot;x=&amp;d&quot;,...

Объявление и инициализация переменных - C++
помогите исправить, пожалуйста.... Решение: #include &lt;iostream.h&gt; #include &lt;math.h&gt; double GetY (unsigned short int Number); ...

Объявление переменных в классе - C++
#pragma once class streetdb { public: streetdb(void); ~streetdb(void); int admiral_1_137; private: };


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.07.2012, 19:19
Ответ Создать тему
Опции темы

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