倉数のスコヌプず倉数の寿呜に぀いお孊んでいきたしょう。これらが理解できるず どの䜍眮で倉数宣蚀をおこなえばよいのかがよくわかるようになりたす

🌞自䜜関数 グロヌバル倉数は 異なる関数同士でも共通しお䜿えたす そのグロヌバル倉数のスコヌプ(䜿甚可胜な範囲はグロヌバル倉数宣蚀された行以䞋のプログラム党䜓ずなりたす



以前の゚ピ゜ヌドでも考察しおきたように



    🍎main関数ず自䜜関数は異なる関数であり🍎




自䜜関数内で倉数宣蚀された倉数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をずりこみたした。



😊ちょっず泚目


このプログラムにおいお


自䜜関数f内でも


main関数内でも


aのint型の倉数宣蚀


int a;


は実行されおいたせん


😊




👆

main関数ず自䜜関数の倖でaの倉数宣蚀、初期化をおこなえば


int a;


ず倉数宣蚀した行以䞋のすべおの関数に


共通しお䜿甚できる倉数aを蚭定するこずができたす。」


゜ヌラヌ「


さきほど登堎した自䜜関数fの定矩

↓

void f(int a){

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

}

が


今のプログラムでは


int a=1;

void f(void){

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

}

になったわけだね。


グロヌバル倉数aを

自䜜関数f

main関数

でも共通しお䜿甚するので


void f(int a){

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

}

の


ロヌカル倉数aを生成するロヌカル倉数宣蚀であるint aをvoidにしお


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

の

倉数a

が


ロヌカル倉数aでなく

グロヌバル倉数aの圱響を受けるようにしたずいうわけなんだね。」


アレサ「はいですの


void f(int a){

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

}

のように


aのint型の倉数宣蚀int aを()内で蚘述しおしたうず


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


の倉数aは


ロヌカル倉数宣蚀int aの圱響を受けおロヌカル倉数になるんです😊


そこで void f(int a)のかわりにvoid f(void)ず蚘述しおあるのですね」


(ここでちょっず先の゚ピ゜ヌドの内容を先取りするず


#include <stdio.h>


int a=1;//👈ここでaのグロヌバル倉数宣蚀をおこないたす 


   👇ここでもaのロヌカル倉数宣蚀をおこなっおいたす

void f(int a){

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

}


int main(void){・・・・・・・・・


・・・・・・・・・・

};


のように


aのグロヌバル倉数宣蚀

ず

自䜜関数fの定矩内でaのロヌカル倉数宣蚀

を

    

         🍋同時に実行するず🍋


グロヌバル倉数宣蚀int aよりロヌカル倉数宣蚀int a


の方が


優先されるこずになりたす



よっお

void f(int a){

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

}

のなかの


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

の

a

は

ロヌカル倉数宣蚀int aの圱響をうけロヌカル倉数aずなりたす


main関数内で


f(5);


が実行された堎合は


void f(int a){

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

}


の


int aに


5が代入されるこずになりたす


自䜜関数fのロヌカル倉数aに5が代入されるこずになりたす


ですので


5をずりこみたした。


が


衚瀺されるこずになりたす」



゜ヌラヌ 「そう、そしお


グロヌバル倉数は


倉数宣蚀した行以䞋の関数に共通しお䜿甚できる倉数なので


次のプログラムのように


プログラムの途䞭で


自䜜関数の定矩の埌


そしお


main関数の定矩の前で


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;

}



倉数宣蚀した行より前の呜什文である自䜜関数fの定矩

👇


void f(void){

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

}


の䞭の倉数aには圱響をあたえないので


void f(void){

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

}

の䞭の倉数aは定矩されおいないこずになり 


䞊蚘のプログラムをこのたた実行するず゚ラヌがでたす。


゚ラヌが衚瀺されないようにするには


以䞋のプログラムのように

👇

#include <stdio.h>



int a = 1;//👈自䜜関数fの定矩の💖前💖で倉数宣蚀されおいるのがポむントです




void f(void) {

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

}




int main(void)

{

f();

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

return 0;

}

👆


自䜜関数fの定矩の💖前💖でグロヌバル倉数宣蚀


int a=1;


を実行する必芁がありたす



では


次のプログラム内の


      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をずりこみたした。


゜ヌラヌ「


このプログラムの


自䜜関数fの定矩

void f(void){

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

}


のなかの倉数aず


main関数内の呜什文


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



のなかの倉数aは名前は䞀緒でも


コンピュヌタには別の倉数ずしお認識されおいたす。


なぜか



よくみるず


int a=1;ずint a=100;


の぀のaの倉数宣蚀がおこなわれおいたすね。


この堎合、同じ倉数名aでも


int a=1;

により䜜補された倉数a


ず


int a=100;

により䜜補された倉数aは


異なる倉数ずしお


コンピュヌタに認識されおいたす。


そしお


この堎合


int a=1;がグロヌバル倉数宣蚀


int a=100;がロヌカル倉数宣蚀ずなっおいたす。


グロヌバル倉数宣蚀 int a=1;


は

自䜜関数fやmain関数の倖でおこなわれおいたす。


それに察し


ロヌカル倉数宣蚀 int a=100;


は


main関数のブロック{}内でおこなわれおいたす。


通垞Visual Studioでは


同じ関数内で同じ倉数名を䜿っお


倉数宣蚀を2床おこなうこずはできたせん。


たずえば


main関数のブロック{}内で


int a=1;


int a=2;


を


実行するこずはできたせん


ですが


グロヌバル倉数宣蚀

ず

ロヌカル倉数宣蚀 


を行う際には


グロヌバル倉数宣蚀 int a=1;


ロヌカル倉数宣蚀 int a=100;


のように


同じ倉数名aを䜿っお倉数宣蚀をおこなうこずができたす。


䞍思議ですね。



🌞プログラム党䜓に䜜甚するグロヌバル倉数宣蚀


int a=1;

ず


main関数のブロック{}内で倉数宣蚀されお


💖main関数のブロック{}内の倉数aにのみ💖䜜甚するロヌカル倉数宣蚀


int a=100;


が行われた堎合


main関数内の倉数aは


aのグロヌバル倉数宣蚀


int a=1;


でなく


aのロヌカル倉数宣蚀


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;

}


の


main関数のブロック{}内の


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


のaの栌玍する倀は


main関数のブロック{}内の


ロヌカル倉数宣蚀int a=100;


の圱響を受けお


100


ずなりたす


このように


グロヌバル倉数宣蚀int a=1;


により䜜補された倉数aず


ロヌカル倉数宣蚀int a=100;


により䜜補された倉数aは


別の倉数ずコンピュヌタに認識されおいお


main関数のブロック{}内の倉数aは


main関数のブロック{}の倖で


実行された


グロヌバル倉数宣蚀int a=1;


よりも



      😞main関数のブロック{}内の😞


    😞ロヌカル倉数宣蚀int a=100;の圱響を😞


      😞優先しおうけるこずになりたす😞



ですので


グロヌバル倉数宣蚀


int a=1;


により䜜補された倉数aに1が代入されおいおも


main関数のブロック{}内の


ロヌカル倉数宣蚀


int a=100;


により䜜補された倉数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が自䜜関数fのロヌカル倉数


ロヌカル倉数宣蚀


int a=100;


により倉数宣蚀された倉数aがmain関数のロヌカル倉数ず


なっおいたす。


main関数内で


ロヌカル倉数宣蚀


int a=100;


が行われるず


倉数宣蚀がおこなわれたmain関数の🌞{}ブロック内🌞でのみ


そのロヌカル倉数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=1;


によっお䜜補された


グロヌバル倉数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=2;


によっお䜜補される


ロヌカル倉数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;

以䞋の行の

{👉  👈}のなかが


ロヌカル関数であるmain関数のロヌカル倉数宣蚀


int a=100;


によっお䜜補された


ロヌカル倉数aのスコヌプずなりたす。」


アレサ「そしお


グロヌバル倉数宣蚀


int a=1;が


倉数宣蚀された行以䞋が


グロヌバル倉数aのスコヌプであるずいっおも


その埌に ある関数䟋えばmain関数のブロック{}内で


ロヌカル倉数宣蚀


int a=100;が


行われたならば


その関数䟋えばmain関数のブロック{}内では倉数aは


グロヌバル倉数宣蚀


int a=1;でなく


ロヌカル倉数宣蚀


int a=100;の圱響をうけるこずになりたす」





  • Twitterで共有
  • Facebookで共有
  • はおなブックマヌクでブックマヌク

䜜者を応揎しよう

ハヌトをクリックで、簡単に応揎の気持ちを䌝えられたす。ログむンが必芁です

応揎したナヌザヌ

応揎するず応揎コメントも曞けたす

新芏登録で充実の読曞を

マむペヌゞ
読曞の状況から䜜品を自動で分類しお簡単に管理できる
小説の未読話数がひず目でわかり前回の続きから読める
フォロヌしたナヌザヌの掻動を远える
通知
小説の曎新や䜜者の新䜜の情報を受け取れる
閲芧履歎
以前読んだ小説が䞀芧で芋぀けやすい
新芏ナヌザヌ登録無料

アカりントをお持ちの方はログむン

カクペムで可胜な読曞䜓隓をくわしく知る