Ошибка C2361: инициализация "найденного" пропускается по метке "по умолчанию"
Возможный дубликат:
Почему переменные не могут быть объявлены в инструкции switch?
У меня есть странная ошибка в моем коде ниже:
char choice=Getchar();
switch(choice)
{
case 's':
cout<<" display tree ";
thetree->displaytree();
break;
case 'i':
cout<<" enter value to insert "<<endl;
cin>>value;
thetree->insert(value);
break;
case 'f' :
cout<< "enter value to find ";
cin>>value;
int found=thetree->find(value);
if(found!=-1)
cout<<" found = "<<value<<endl;
else
cout<< " not found " <<value <<endl;
break;
default:
cout <<" invalid entry "<<endl;;
}
Компилятор Visual Studio 2010 говорит, что:
1>c:\users\daviti\documents\visual studio 2010\projects\2-3-4\2-3-4\2-3-4.cpp(317): error C2361: initialization of 'found' is skipped by 'default' label
1> c:\users\daviti\documents\visual studio 2010\projects\2-3-4\2-3-4\2-3-4.cpp(308) : see declaration of 'found'
Я думаю, что я правильно написал инструкции break и default, поэтому где ошибка?
Ответы
Ответ 1
Вам нужно либо приложить case 'f':
к скобке с расширенными возможностями:
case 'f' :
{
cout<< "enter value to find ";
cin>>value;
int found=thetree->find(value);
if(found!=-1)
cout<<" found = "<<value<<endl;
else
cout<< " not found " <<value <<endl;
break;
}
или поместите объявление found
вне switch
Ответ 2
Семантикой a switch
являются те из goto
: case
do not
ввести новый масштаб. Таким образом, found
доступен в вашем случае default:
(хотя вы на самом деле не обращаетесь к нему). Прыжки по нетривиальному
инициализация является незаконной, поэтому ваш код становится незаконным.
Учитывая сложность вашего case 'f':
, лучшим решением является, вероятно,
чтобы разделить его на отдельную функцию. В противном случае вы можете
весь случай в {...}
, создавая отдельный объем или
инициализация, запись:
int found;
found = thetree->find(value);
(Я упомянул об этом для полноты. Это не решение, которое я бы
рекомендую.)
Ответ 3
Вам нужно объявить внутренние переменные switch
case
в фигурных скобках. то есть.
case 'f' :
{
...
int found=thetree->find(value);
...
}