case文で変数を定義する問題
817 ワード
今日実験室で、同級生はcaseで変数を定義する質問をしました.例えば、
コンパイラはエラーを報告します.
このように書くと(変数定義の場所に「{}」):
コンパイラはエラーを報告しません.理由は次のとおりです.
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の変数を必ず呼び出すと仮定すると、この変数をグローバル変数として定義する.
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の変数を必ず呼び出すと仮定すると、この変数をグローバル変数として定義する.