case文で変数を定義する問題

817 ワード

今日実験室で、同級生はcaseで変数を定義する質問をしました.例えば、
switch(n)
{
    case 1:int i=0;break;
    case 2:....;break;
    case 3:....;break;
    default:.......
}

コンパイラはエラーを報告します.
  :      ‘int i’     

このように書くと(変数定義の場所に「{}」):
switch(n)
{
    case 1:{int i=0;}break;
    case 2:....;break;
    case 3:....;break;
    default:.......
}

コンパイラはエラーを報告しません.理由は次のとおりです.
C++コンパイラは、case 1に変数が定義されている場合、case 1とcase 2は同じ役割ドメインにあるため、case 2は理論的にcase 1の変数を呼び出すことができる場合を考慮した.case 2がそうすると、nの値が直接2の場合、case 1をスキップしてcase 2が実行されますが、case 2が呼び出したcase 1の変数は、case 1が実行されていないため定義されていないため、エラーが発生します.
これを防止するためには、case 1で変数を定義する部分に「{}」を付けて変数の役割ドメイン(case 2に変数iが見えないため、iがcase 2に呼び出されないようにする)を制限し、エラーを回避する必要がある.case 2がcase 1の変数を必ず呼び出すと仮定すると、この変数をグローバル変数として定義する.