質問: ``` ~~何らかのコードブロック ... .. . int a; ~~aを使う何らかのコードブロック ``` ``` int a; ~~何らかのコードブロック(aは使用しない) ... .. . ~~aを使う何らかのコードブロック ``` このコードの例では適切な変数の定義位置は、 変数aが使用されるすぐ前(つまり上のコード)らしいのですが、 なぜですか?変数のスコープが大きいと読み手が不安になると 本で読んだのですが理由がわかりません。 使われているところだけ読み取れると思うのですが・・・
回答: こんにちは。 > > 変数のスコープが大きいと読み手が不安になると > > 本で読んだのですが理由がわかりません。 > > > 例えば、その変数aを使う処理を修正する事になり、aをdouble型へ変更する必要があると仮定します。 そのaが当該処理だけでのみ使われているのであれば、安心して変更できます。 変数aのスコープを必要最小限にしておけば、その狭いスコープ内だけを確認すれば当該処理のみで使われていることを確認できるので手間が少ないです。 また、無駄にスコープが広いと変数定義(変数名を考えて定義文を書く)をサボって流用してしまうこともあります。この場合、doubleへ変更したいところと流用してしまったところがあり、流用した方は変更したくありません。結果、改造する方の変数aを新たに別途定義し、当該処理のaを使っているコードを全て修正しないといけません。「無駄な」手間がかかります。(意外に頻発するのですよ、これ。) ですので、私は次のようなコードを書くことも多いです。 ``` int main() { { int a=aの最初の値を決定する関数(); // aを使う処理 } } ``` 慣れるとずいぶん気が楽になりますよ。 他にも、aのスコープが広いと、間違って変更したり参照したりすることも発生し得ます。コンパイラが検出できないバグの発生確率が上がるという意味です。スコープが狭ければ、スコープ外で間違ってアクセスしてもコンパイラがエラーにしますので事前にチェックできます。これによりプログラムの信頼性が上がります。 とはいえ、大抵の場合はデバッグ時点で検出できると思います。でも、たまたまテストにも通ってしまうと、もうその変数aを触ることができません。長い期間の間にはそうやって「ゴミ」が溜まっていきます。「この変数はゴミと思うけど再テストの手間を考えると削除できない」って嫌なものです。