可能重复:
Why can't variables be declared in a switch statement?
我的代码中有一个奇怪的错误:
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语句,那么错误在哪里?
答案 0 :(得分:55)
您需要用范围大括号括起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
答案 1 :(得分:20)
switch
的语义是goto
:case
的语义
介绍一个新的范围。因此found
案例中可以访问default:
(虽然你实际上并没有访问它)。跳过一个非平凡的
初始化是非法的,因此您的代码变得非法。
考虑到case 'f':
的复杂性,可能是最佳解决方案
把它分解成一个单独的函数。没错,你可以放
{...}
中的整个案例,创建一个单独的范围,或放弃
初始化,写作:
int found;
found = thetree->find(value);
(我提到这是为了完整性。它是不是我想要的解决方案 电子书籍。)
答案 2 :(得分:7)
您需要在花括号内声明switch
的{{1}}的内部变量。即。
case