错误 C2361:'found'的初始化被'default'标签跳过

8 浏览
0 Comments

错误 C2361:'found'的初始化被'default'标签跳过

这个问题已经有了答案:

可能是重复:

为什么不能在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 " <

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语句,那么错误在哪里?

admin 更改状态以发布 2023年5月20日
0
0 Comments

switch的语义与goto相同:一个case不会引入新的作用域。因此,found在你的default:分支中是可访问的(尽管你实际上没有访问它)。跳过一个非平凡的初始化是非法的,因此你的代码变得非法。

鉴于你的case 'f':的复杂性,最好的解决方案可能是将其拆分为一个单独的函数。如果无法做到这一点,可以将整个分支放入{...}中,创建一个新的作用域,或者放弃初始化,写成:

int found;
found = thetree->find(value);

(我提到这个是为了完整性。这不是我推荐的解决方案。)

0
0 Comments

你需要在 case 'f': 周围加上一个限定作用域的花括号:

case 'f' :
{  
    cout<< "enter value to find ";
    cin>>value;
    int found=thetree->find(value);
    if(found!=-1)
        cout<<" found  =  "<

或者将 found 的声明放在 switch 的外面

0