ぱふの自由帳

週2更新目指す技術ブログ。メインはUnity。最近、競プロ始めましたー!良ければフォローお願いします(`・ω・´)

switch文のスコープのお話

はじめに

ふとした時に役立つswitch文のスコープについての話です。

switch文のスコープ

違いが分かりますか?

2種類のswitch文を使用したコードを載せます。
違いを答えることが出来ますか?

switch(hoge){
  case 0:
    int i = 2;
    break;

  case 1:
    int i = 4;
    break;
}
switch(hoge){
  case 0:
    {
      int i = 2;
      break;
    }

  case 1:
    {
      int i = 4;
      break;
    }
}

違いを解説

1つ目のコードは動きませんが、2つ目は問題なく動きます。
原因は...そう!記事のタイトルにもあるようにスコープです。

switch文のスコープはデフォルトのままだとswitch文全体に及びます。すなわち、case 0内で宣言した変数をcase 1内でも使用できるのです。なので、1つ目のコードは同じ変数名で宣言をしているとみなされて動かなかったんですね。
しかし、case内で{}を用いると...{}内部にのみ適応されるスコープが出来上がります。そのため、2つ目のコードは問題なく動いたのです。

おわり

switch文の内部で凝った実装をするとスコープが邪魔をしてきます。
「実装方法に問題がある!」と言われてしまえばそれまでですが、変数のスコープで困った場合は{}で解決しちゃいましょう!

追記:{}で囲むとswitch文に限らず新たなスコープを作成できるようです。指摘してくれた方、ありがとうございます! ((((一回も使ったことなくて知らなかった...