[解決済み】エラー。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;
}
関連
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] JavaScriptで複数ケースを扱うSwitch文
-
[解決済み] switch文の複数ケース
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】「switch」は「if」よりも速い?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】'cout'は型名ではない
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] クロスの初期化エラーが多発する
-
[解決済み] ラベルの後に初期化される変数がある場合、「ラベルは文の一部でしかなく、宣言は文ではありません」となるのはなぜですか?[重複しています]。