変数のスコープと変数の寿命について学んでいきましょう。これらが理解できると どの位置で変数宣言をおこなえばよいのかがよくわかるようになります

🌞自作関数11 グローバル変数は 異なる関数同士でも共通して使えます そのグローバル変数のスコープ(使用可能な範囲)はグローバル変数宣言された行以下のプログラム全体となります

以前のエピソードのように


自作関数内で変数宣言された変数a

と

main関数内で変数宣言された変数aは


別の変数扱いとなり


自作関数内で変数宣言された変数aに格納されている値を変化させても


main関数内で変数宣言された変数aに格納されている値は影響をうけません。


逆に


main関数内で変数宣言された変数aに格納されている値を変化させても


自作関数内で変数宣言された変数aに格納されている値は影響をうけません。


それでは異なる関数同士でも共通して使える変数を設定するには


どうしたらよいのでしょうか?


アレサ 「その場合は 次のプログラムの


int a=1;のように


#include <stdio.h>


int a=1;


void f(void){

printf("%dをとりこみました。\n",a);

}


int main(void)

{

f();

printf("%dをとりこみました。\n",a);

return 0;

}


コンパイル結果

1をとりこみました。

1をとりこみました。



関数の外でaの変数宣言、初期化をおこなえば


その変数宣言した行以下のすべての関数に


共通して使用できる変数を設定することができます。」


ソーラー「


void f(int a){

printf("%dをとりこみました。\n",a);

}

が


int a;

void f(void){

printf("%dをとりこみました。\n",a);

}

になったわけだね。


グローバル変数aを

自作関数f

main関数

でも共通して使用するので


void f(int a){

printf("%dをとりこみました。\n",a);

}

の


int aをvoidにして

printf("%dをとりこみました。\n",a);

の

変数a

が

グローバル変数の影響を受けるようにしたというわけなんだね。」


アレサ「int aと変数宣言を()内で記述してしまうと


printf("%dをとりこみました。\n",a);


の変数aは


変数宣言int aの影響を受けてローカル変数になるんですのね😊


そこで void f(int a)のかわりにvoid f(void)と記述してあるのです。」


ソーラー 「そう、そして


グローバル変数は


変数宣言した行以下の関数に共通して使用できる変数なので


次のプログラムのように


プログラムの途中で関数の外で


int a=1;


と変数宣言を行った場合



#include <stdio.h>


void f(void){

printf("%dをとりこみました。\n",a);

}


int a=1;


int main(void)

{

f();

printf("%dをとりこみました。\n",a);

return 0;

}



変数宣言した行より前の命令文

👇


void f(void){

printf("%dをとりこみました。\n",a);

}


の中の変数aには影響をあたえないので


void f(void){

printf("%dをとりこみました。\n",a);

}

の中の変数aは定義されていないことになり 


このままコンパイルするとコンパイルエラーがでます。


このように関数の外で変数宣言された変数を


グローバル変数といいます。


では


次のプログラム内の


      int a=1;とint a=100;


は


どちらがローカル変数宣言でどちらがグローバル変数宣言でしょうか?」


#include <stdio.h>

int a=1;

void f(void){

printf("%dをとりこみました。\n",a);

}


int main(void)

{

int a=100;

f();

printf("%dをとりこみました。\n",a);

return 0;

}


コンパイル結果


1をとりこみました。

100をとりこみました。


ソーラー「


このプログラムの


自作関数の定義

void f(void){

printf("%dをとりこみました。\n",a);

}


のなかの変数aと


main関数内の命令文

printf("%dをとりこみました。\n",a);

return 0;


のなかの変数aは名前は一緒でも


コンピュータには別の変数として認識されています。


だって、よくみると


int a=1;とint a=100;


の2つのaの変数宣言がおこなわれていますね。


この場合、同じ変数名aでも


int a=1;

により作成された変数a


と


int a=100;

により作製された変数aは


異なる変数として


コンピュータに認識されています。


そして


この場合


int a=1;がグローバル変数宣言


int a=100;がローカル変数宣言となっています。


グローバル変数宣言 int a=1;


は

自作関数やmain関数の外でおこなわれています。


それに対し


ローカル変数宣言 int a=100;


はmain関数内でおこなわれています。


通常Visual Studioでは


同じ関数内で同じ変数名を使って


変数宣言を2度おこなうことはできません。


ですが


グローバル変数宣言

と

ローカル変数宣言 


を行う際には


グローバル変数宣言 int a=1;


ローカル変数宣言 int a=100;


のように


同じ変数名aを使って変数宣言をおこなうことができます。


不思議ですね。



🌞プログラム全体に作用するグローバル変数宣言


int a=1;

と


main関数のブロック{}内で変数宣言されて


main関数のブロック{}内の変数aにのみ作用するローカル変数宣言


int a=100;


が行われた場合


main関数内の変数aは


aのグローバル変数宣言でなく


aのローカル変数宣言


int a=100;


の影響をうけることになります。


なぜなら


グローバル変数宣言int a=1;


により作製された変数aと


ローカル変数宣言inta=100;


により作製された変数aは


別のものとコンピュータに認識されており


グローバル変数宣言


により作製された変数aに1が代入されていても


ローカル変数宣言


により作製された変数aに1が代入されることはないからです。



ではではっ


次のプログラムでは


どれが

グローバル変数宣言で


ローカル変数宣言でしょうか?


#include <stdio.h>


int a=1;

void f(void){

int a=2;

printf("%dをとりこみました。\n",a);

}


int main(void)

{

int a=100;

f();

printf("%dをとりこみました。\n",a);

return 0;

}


コンパイル結果


2をとりこみました。

100をとりこみました。


この場合は


グローバル変数宣言


int a=1;


で変数宣言された変数aがグローバル変数


ローカル変数宣言


int a=2;


で変数宣言された変数aが自作関数のローカル変数


ローカル変数宣言


int a=100;


で変数宣言された変数aがmain関数のローカル変数と


なっています。


ローカル変数の変数宣言


int a=100;


が行われると


変数宣言がおこなわれた{}の🌞ブロック内🌞でのみ


そのローカル変数aは使用可能となります。


そのローカル変数aが使用可能な範囲をローカル変数aのスコープといいます


グローバル変数宣言


int a=1;


により作製された


グローバル変数aはグローバル変数宣言された行以下のプログラム全体で


使用可能になります。


そのグローバル変数が使用可能な範囲をグローバル変数aのスコープといいます



今のプログラムの場合では

#include <stdio.h>


int a=1;

void f(void){

int a=2;

printf("%dをとりこみました。\n",a);

}


int main(void)

{

int a=100;

👉

f();

printf("%dをとりこみました。\n",a);

return 0;

👈}


{👉  👈}のなかが


ローカル変数宣言

int a=100;


によって作製された


ローカル変数aのスコープとなります。


アレサ「グローバル変数宣言


int a=1;が


変数宣言された行以下が


グローバル変数aのスコープであるといっても


その後に ある関数のブロック{}内で


ローカル変数宣言


int a=100;が


行われたならば


その関数のブロック{}内では変数aは


グローバル変数宣言


int a=1;でなく


ローカル変数宣言


int a=100;の影響をうけます」





  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます