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文に限らず新たなスコープを作成できるようです。指摘してくれた方、ありがとうございます! ((((一回も使ったことなくて知らなかった...