変数の寿命

グローバルスコープファイルスコープときたら、次はローカルスコープね。
はい。……でも、ローカルスコープの変数を使うのに、コツみたいなものってあるんでしょうか?
もちろん、あるわよ。
そうなんですね。教えてください!

ローカルスコープは、ブロックスコープとも言います。「ブロック」とは、中括弧で囲まれた部分のことです。

ブロックを使うとローカル変数の寿命を制御できますが、このことを知らない人も意外に多いようです。

次のプログラムを見てみましょう。

main.c
#include <stdio.h>
#include <stdlib.h>

int main() {
  int n1 = 123;
  int n2 = 456;

  {
    int temp = n1;
    n1 = n2;
    n2 = temp;
  }

  printf("n1 = %d\n", n1);
  printf("n2 = %d\n", n2);

  return EXIT_SUCCESS;
}
実行結果
n1 = 456
n2 = 123

2つの変数の値を入れ替えるだけの単純なプログラムです。

ここでは、変数tempに注目してね。
突然あらわれた中括弧で囲まれた内側で宣言されていますね!

この例のように、ブロックの内側で宣言されたローカル変数は、そのブロックの内側だけで有効です。ブロックの外側では使えません。そして、その変数は制御がブロックを抜けるときに消滅します。

つまりこういうこと

  • ローカル変数は、ブロックの内側で確保される
  • ブロックの終わりで、確保されていたローカル変数は解放される

もうひとつ、別の例をあげましょう。

main.c
#include <stdio.h>
#include <stdlib.h>

int main() {
  int nSum = 0;

  for (int i=0; i<10; i++) {
    int temp = i * i;
    nSum += temp;
  }

  printf("SUM = %d\n", nSum);

  return EXIT_SUCCESS;
}
実行結果
SUM = 285

ifwhileなどの制御構文とともに現れる中括弧で囲まれた部分もブロックです。上記はfor文の例ですが、中括弧の内側にある変数tempは、ブロックを抜けるときに消滅します。同じ名前の変数がループの回数(ここでは10回)だけ、生まれては消えているというわけです。

一般的に、一つ一つの変数の寿命(生まれてから消えるまで)を短くするほうが理解しやすいプログラムになります。アルゴリズムを考えるときに、一度に気を配らなければならない範囲を狭められるためです。

上の例のtempのように、一時的にしか使わない変数は、ブロックで囲んでしまうと分かりやすいでしょ?
たしかに、スコープが限られていると、プログラムが理解しやすくなりますね!
そういうこと。
ここがポイント!
一時的にしか使わないローカル変数は、ブロックで囲んで寿命を制御しましょう。一度に気を配らなければならない範囲を狭めることで、理解しやすいプログラムになります。