転載:switch/case文では、各caseにかっこを付ける

1561 ワード

前言
多くのコードを書いてこそ、問題を発見することができ、既存のコードでも、手を打っても収穫があり、これは非常に無言の問題に遭遇しません.
問題と原因、解決方法は以下の転載内容を参照してください.
オリジナル:ChirlChen
ブログアドレス:https://blog.csdn.net/qqmindyourwill/article/details/52815886
転載内容
  • 問題の説明:switch-caseで定義されたローカル変数(次の例の「case ECOLOR_REDコード1で定義されたtemp変数」のように、通常のコードの書き込み中によく発生します.)をクリックします.前に本の中でこの問題に言及したことがあることを見て、しかし長い間C++を書いていないで、具体的にどういうことを忘れて、今度使ってやっと分かりました.后で万一忘れて便利に调べるために、わざわざ说明を书きます.
  •     switch(color)
        {
        case ECOLOR_RED:
             int temp = 10;  //1: case        ERROR;
             ……
             do something;
             ……
             break;
        case ECOLOR_GREEN:
            {
                int temp = 20;  //2: case        RIGHT;
                ……
                do something;
                ……
            }
            break;
        case ECOLOR_BLUE:
            cout << "temp = " << temp << endl;  //3:          , ERROR
            ……
            break;
        default:
            ……
            break;
        }   
  • ソリューション:具体的な解決策は、上記のコード例の「case ECOLOR_GREEN」のように、caseに「{}」を加えて、ローカル変数をコードブロックに定義することで、問題を解決することができます.
  • 理由:
  • は、switchに含まれるコード全体が同じコードブロックに属するため、caseごとにコードブロックを表すのではなく、同じコードブロックに属する.
  • は、上記のコードセグメントの第1のケースで定義する変数tempに従って、同じコードブロックの「case ECOL_BLUE」内部でもこの変数を参照することができ(上のコード3に示すように)、switchから送られてきたタグ値「color==ECOLOR_BLUE」の場合、コード3で定義されていない変数「temp」を参照することになる.VC 10コンパイラは比較的友好的であり、「error C 2300:“b”の初期化操作は「case」によるラベルスキップ」は、ここで説明した場合を指します.
  • ですので、上のコード1、3はすべて間違っています.正しい使い方はコード2のやり方に従って、「temp」変数を使う必要があるコードを括弧で囲んで、コードブロックを構成し、このコードブロックを超えた後、この変数は失効します.