[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
2022-03-18 16:26:04
質問
いつも不思議に思うのですが、なぜswitch文のcaseラベルの後に変数を宣言してはいけないのでしょうか? C++では、変数はほとんどどこでも宣言できますが(最初に使う場所の近くで宣言するのは明らかに良いことです)、次のようにするとまだうまくいきません。
switch (val)
{
case VAL:
// This won't work
int newVal = 42;
break;
case ANOTHER_VAL:
...
break;
}
上記では、以下のようなエラーになります(MSC)。
newVal' の初期化は 'case' ラベルでスキップされます。
これは他の言語でも制限されているようです。 なぜこのような問題があるのでしょうか?
解決するには?
Case
ステートメントは
ラベル
. つまり、コンパイラはこれをラベルに直接ジャンプしていると解釈します。C++の場合、ここで問題になるのはスコープの問題である。中括弧がスコープを定義しており、その範囲は
switch
ステートメントを使用します。つまり、初期化をスキップして、さらにコードの中にジャンプが実行されるようなスコープが残っていることになります。
これを処理する正しい方法は、そのスコープに特化して定義することです。
case
文の中で変数を定義してください。
switch (val)
{
case VAL:
{
// This will work
int newVal = 42;
break;
}
case ANOTHER_VAL:
...
break;
}
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] JavaScriptで複数ケースを扱うSwitch文
-
[解決済み] switch文の複数ケース
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] element'の初期化が'case'ラベルでスキップされる [重複].