1. ホーム
  2. c++

[解決済み】エラー。switchステートメントでcaseラベルにジャンプする

2022-01-23 21:16:19

質問

switch文を使用したプログラムを作成しましたが、コンパイル時に表示されます。

エラーです。ケースラベルにジャンプします。

なぜそうなるのでしょうか?

#include <iostream>
int main() 
{
    int choice;
    std::cin >> choice;
    switch(choice)
    {
      case 1:
        int i=0;
        break;
      case 2: // error here 
    }
}

解決方法は?

この問題は、1つの変数で宣言された case は、後続の case を明示的に指定しない限り { } ブロックが使用されます。 が、初期化されることはありません。 なぜなら、初期化コードは別の case .

次のコードでは、もし foo が1になれば問題ないが、2になると、誤って i という変数がありますが、これは確かに存在するのですが、おそらくゴミを含んでいます。

switch(foo) {
  case 1:
    int i = 42; // i exists all the way to the end of the switch
    dostuff(i);
    break;
  case 2:
    dostuff(i*2); // i is *also* in scope here, but is not initialized!
}

明示的なブロックでケースを包むと、問題が解決します。

switch(foo) {
  case 1:
    {
        int i = 42; // i only exists within the { }
        dostuff(i);
        break;
    }
  case 2:
    dostuff(123); // Now you cannot use i accidentally
}

編集

さらに詳しく説明すると switch ステートメントは、特に派手な種類の goto . 以下は、同じ問題を示す類似のコードで goto の代わりに switch :

int main() {
    if(rand() % 2) // Toss a coin
        goto end;

    int i = 42;

  end:
    // We either skipped the declaration of i or not,
    // but either way the variable i exists here, because
    // variable scopes are resolved at compile time.
    // Whether the *initialization* code was run, though,
    // depends on whether rand returned 0 or 1.
    std::cout << i;
}