C/C++のswitch文で変数を宣言できないのはなぜ?正しい宣言方法とエラーの原因を解説
C/C++のswitch文では、実は変数を宣言することが可能です。ただし、単純にcaseラベルの直後に宣言するのではなく、新しいスコープ(ブロック)の中で宣言し、使用する必要があります。
switch文内で変数を宣言する例
#include<iostream>
using namespace std;
int main() {
int i = 10;
switch(i) {
case 2:
// 何らかの処理
break;
case 10:{
int x = 13;
cout << x;
}
}
return 0;
}出力結果
このプログラムを実行すると、次の出力が得られます。
13
なぜスコープが必要なのか?
caseラベルの直下など、スコープを区切らずに変数を直接宣言しようとすると、コンパイルエラーが発生する可能性があります。その理由は、caseラベルへのジャンプがgoto文と同じ扱いになるためです。
同じスコープ内にローカル変数の宣言があり、その後のコードでその変数を使用している場合、宣言位置を「またいで」ジャンプすると、初期化されていない変数を参照してしまう恐れがあります。C++ではこのような危険な動作を防ぐため、同一スコープ内のローカル変数宣言をまたぐジャンプは許可されていません。
一方、中括弧 { } で囲んで独立したブロックスコープを作れば、その変数はブロック内でのみ有効になります。そのため、他のcaseラベルへジャンプしても初期化の問題が起こらず、安全に変数を扱えるのです。
ポイントまとめ
- switch文の中でも変数の宣言は可能
- 宣言・使用は中括弧
{ }で作った新しいスコープ内で行う - caseラベルへのジャンプはgotoと同等のため、同一スコープの変数宣言をまたぐジャンプはエラーになる
-
C/C++でローカル変数のメモリにスコープ外からアクセスできるのか?
C/C++では、ローカル変数のメモリにスコープ外からアクセスできてしまう可能性があります。まずは具体的なコード例を見てみましょう。コード例#include<iostream> int* foo() { int x = 3; return &x; } int main() { int* address = foo(); cout << *address; *address = 12; cout << *address; }出力結果このプログラムは、次のような出力を返す場合があります。3 12なぜ動いて見
-
【C++入門】変数のスコープとは?ローカル変数とグローバル変数の違いを解説
スコープとは スコープ(有効範囲)とは、プログラムの中で変数が参照・使用できる領域のことです。C++において、変数を宣言できる場所は大きく分けて次の3つがあります。 ローカル変数:関数やブロックの内部で宣言される変数 仮引数(形式パラメータ):関数の引数定義部分で宣言される変数 グローバル変数:すべての関数の外部で宣言される変数 ローカル変数の使い方 ローカル変数は、それが宣言された関数やコードブロックの内部にあるステートメントからしか利用できません。関数自身も、他の関数のローカル変数の存在を認識することはできません。 サンプルコード #include <iostream> u