20

重複の可能性:
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;;
    }

VisualStudio2010コンパイラは次のように述べています。

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ステートメントを正しく書いたと思いますが、エラーはどこにありますか?

4

3 に答える 3

60

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

于 2012-04-30T09:23:14.843 に答える
24

aのセマンティクスはswitchgotoのセマンティクスです。sはcase新しいスコープを導入しません。したがってfound、あなたのdefault:場合はアクセス可能です(実際にはアクセスしませんが)。重要な初期化を飛び越えることは違法であるため、コードは違法になります。

の複雑さを考えるとcase 'f':、最善の解決策はおそらくそれを別の関数に分解することです。それができない場合は{...}、ケース全体を入れて別のスコープを作成するか、初期化を行わずに次のように記述します。

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

(完全を期すためにこれについて言及します。これは私が推奨する解決策ではありません。)

于 2012-04-30T09:27:26.897 に答える
7

中括弧内でswitch'sの内部変数を宣言する必要があります。caseすなわち

case 'f' :
{
    ...
    int found=thetree->find(value);
    ...
}
于 2012-04-30T09:17:22.750 に答える