6

switch-case ステートメントでは、declaration-with-initializationは無効ですが、declaration-and-then-assignmentは許可されています。次のコード スニペットに示すように。

コンパイラ側から見たこれら 2 種類の初期化の違いは何ですか? また、最初のタイプの初期化が無効で、2 番目のタイプが有効なのはなぜですか。

switch(val)  
{  
case 0:  
  int newVal = 42;  //Invalid
  break;
case 1:  
  int newVal2;      //Valid
  newVal2 = 42;  
  break;
case 2:
  break;
}
4

2 に答える 2

10

事実上、ルールは、初期化を含む宣言を超えて (または非 POD 型変数の宣言を超えて) ブロックにジャンプできないことです。C++ 標準は次のように述べています (C++03 §6.7):

ブロックに転送することは可能ですが、初期化で宣言をバイパスする方法ではできません。自動保存期間を持つローカル変数がスコープ内にないポイントからスコープ内にあるポイントにジャンプ(77)するプログラムは、変数が POD 型 (3.9) を持ち、初期化子 ( 8.5)。

(*)switchステートメントの条件からcaseラベルへの移行は、この点でジャンプと見なされます。

int newVal = 42;= 42初期化子 (パーツ)を持つ宣言です。val1または2の場合、初期化を過ぎて switch ブロックにジャンプするため、プログラムの形式が正しくありません。

int newVal2;宣言でもあります。は POD 型であり、宣言に初期化子がないためint、この宣言を飛び越えることができます。

于 2010-09-21T05:47:34.103 に答える
5

実際、どちらも正当な C++ ではありません。スコープが設定されていない限り、switch ケースで変数を宣言することはできません。

switch(val)  
{  
case 0:  
  {
    int newVal = 42;  // now valid
  }
  break;
case 1:  
  {
    int newVal2;      // still Valid
    newVal2 = 42;  
  }
  break;
case 2:
  break;
}

コンパイラがケース 1 を許可するという事実は、コンパイラの欠陥であるか、拡張機能である可能性があります。少なくとも、標準によると。

于 2010-09-21T05:09:53.060 に答える