いつも感謝しています。Nです。
変数の有効範囲1(ローカル変数)
グローバル変数の性質とその危険性
で、変数を有効範囲という視点から分類してお話ししました。
今回は、変数を有効期限という視点から分類してお話ししたいと思います。
私は、
思考する上で、分類という方法を用いるのは非常に重要であると考えています。
分類というのは、日常生活でもおそらく皆さんもごく自然にやっていることだと思います。
たとえば、人をどうやって分類していますか?
性別で分類すると、男の人、女の人
年齢で分類すると、10代、20代、30代、40代、50代、60代・・・
血液型で分類すると、A型、B型、AB型、O型
などなど。
そして、
何かを学ぶとき、思考するときは、このような分類を意識的に行っていくことで比較的楽に学習していくことができます。
是非、皆さんも日常生活で体験していることを、分類してみる練習をしてみてくださいね。
そうすることで、「あっ、私はこんな分類傾向にあるんだ」とかがわかってきます。
そしてこの能力は、プログラムをする上でも非常に重要なものです。
さて、話をもどして、
変数の有効期限について具体的にお話ししていきますね。
まず、有効期限とはどういう意味か?
字のごとく、有効である期限・期間という意味ですね。
たとえば、電車の定期券を有効期限から分類すると、1ヶ月、2ヶ月、3ヶ月という風に分類できますね。
これと同じで、変数も有効期限から分類することが出来て、大きく分けると2つに分類できます。
”自動変数”と”静的変数”
です。
まずは、
自動変数からサンプルプログラムを用いて説明しますね。
#include <stdio.h>
void myFunc(void);
int main( void )
{
myFunc();
myFunc();
myFunc();
return( 0 );
}
void myFunc( void )
{
int a = 0;
a++;
printf(“a=%d¥n”,a);
}
実行結果:
a = 1
a = 1
a = 1
このサンプルプログラムは、
変数aをa++して表示する自作関数myFuncをmain関数から3回呼んでいるものです。
ここで、
int a = 0; の部分と実行結果に注目してください。
これは、今までにも出てきた変数の宣言の仕方ですね。
このように今まで通り変数を宣言すると、変数の期限という分類の仕方では、自動変数と呼ばれるものになります。
で、この自動変数が値を保持できる有効期限は、
関数に実行が移って生成されてから、その関数を抜けるまでです。
サンプルプログラムでいうと、
myFunc関数に実行が移って、抜けると自動変数は値をもう保持できないので、
実行結果としては、a = 1が3回表示されるということになります。
では、次に
静的変数についても、サンプルプログラムを用いて説明しますね。
#include <stdio.h>
void myFunc(void);
int main( void )
{
myFunc();
myFunc();
myFunc();
return( 0 );
}
void myFunc( void )
{
static int a;
a++;
printf(“a=%d¥n”,a);
}
実行結果:
a = 1
a = 2
a = 3
さて、今度は
static int a; と実行結果の部分に注目していください。
先ほどの自動変数のサンプルプログラムとの違いは、変数の宣言のところで、staticという文字が追加されていますね。
このように、staticを付け加えて宣言した変数を静的変数と呼びます。
しかし、実行結果がだいぶ異なりましたね。
もう結果から分かった方もいると思いますが、
この静的変数が値を保持できる有効期限は、プログラムの実行が始まってから終わるまでです。
そのため、サンプルプログラムでは、
静的変数は前の値を保持しているので、myFunc関数が呼ばれるたびに足し算されて、実行結果のようになるということです。
ここで、もう一点注意があります。
静的変数の場合、変数宣言で値をあえて明示的に初期化しない場合は、0に初期化されるという点です。
つまり、static int a; と書くと、static int a = 0; とプログラムが自動的にしてくれるということです。
以上、今回は変数を有効期限という視点の分類からお話ししました。
実際にサンプルプログラムを書いて確かめてみてくださいね。