Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

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と同等のため、同一スコープの変数宣言をまたぐジャンプはエラーになる
  1. 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なぜ動いて見

  2. 【C++入門】変数のスコープとは?ローカル変数とグローバル変数の違いを解説

    スコープとは スコープ(有効範囲)とは、プログラムの中で変数が参照・使用できる領域のことです。C++において、変数を宣言できる場所は大きく分けて次の3つがあります。 ローカル変数:関数やブロックの内部で宣言される変数 仮引数(形式パラメータ):関数の引数定義部分で宣言される変数 グローバル変数:すべての関数の外部で宣言される変数 ローカル変数の使い方 ローカル変数は、それが宣言された関数やコードブロックの内部にあるステートメントからしか利用できません。関数自身も、他の関数のローカル変数の存在を認識することはできません。 サンプルコード #include <iostream> u