なぜ変数はswitch文で宣言できないのでしょうか? 質問する

なぜ変数はswitch文で宣言できないのでしょうか? 質問する

私はいつも疑問に思っていました。なぜ switch ステートメントの case ラベルの後に変数を宣言できないのでしょうか? C++ では、変数をほぼどこでも宣言できます (そして、最初に使用する場所の近くに宣言するのは明らかに良いことです) が、次のコードはまだ機能しません。

switch (val)  
{  
case VAL:  
  // This won't work
  int newVal = 42;  
  break;
case ANOTHER_VAL:  
  ...
  break;
}  

上記の場合、次のエラーが発生します (MSC):

'newVal' の初期化は 'case' ラベルによってスキップされます

これは他の言語でも制限事項のようです。なぜこれが問題になるのでしょうか?

ベストアンサー1

Caseステートメントはラベルのみです。つまり、コンパイラはこれをラベルへの直接ジャンプとして解釈します。C++ では、ここでの問題はスコープの 1 つです。中括弧は、ステートメント内のすべてのものをスコープとして定義しますswitch。つまり、初期化をスキップしてコードのさらに奥にジャンプするスコープが残されます。

これを処理する正しい方法は、そのcaseステートメントに固有のスコープを定義し、その中で変数を定義することです。

switch (val)
{   
case VAL:  
{
  // This will work
  int newVal = 42;  
  break;
}
case ANOTHER_VAL:  
...
break;
}

おすすめ記事