変数のスコープを検討する。


変数を考える上で大切となってくる概念のひとつが、「スコープ」です。

今回は、内部変数、大域変数、静的変数について検討します。



//  scope.c
#include<stdio.h>

//以下、内部変数、大域変数、静的変数を宣言する。
//初期値は各々0に設定し、forループが回ると値がどう変化するかを調査する。

/*大域宣言(z):関数の外で宣言され、すべての関数で有効な変数*/
int z=0;

int main(void)
{
int i;
for(i=1;i<11; i++)
{
printf("---%d times---\n",i);
myfunc();
}
return 0;
}

int myfunc(){
/*静的宣言(x):宣言された関数の内部でのみ有効であるが、
  その関数から抜けても消滅しない変数。もう一度同じ関数が呼ばれたときに、
  前回の関数実行で保存された値を引き続きしようすることができる。*/
static int x = 0;
/*内部宣言(y):宣言された関数の内部でのみ有効な変数*/
int y=0;
x = x+1;
y = y+1;
z = z+1;
printf("x=%d\t y=%d\t z=%d\n",x,y,z);
}


$ gcc -o scope scope.c

$ ./scope

---1 times---
x=1 y=1 z=1
---2 times---
x=2 y=1 z=2
---3 times---
x=3 y=1 z=3
---4 times---
x=4 y=1 z=4
---5 times---
x=5 y=1 z=5
---6 times---
x=6 y=1 z=6
---7 times---
x=7 y=1 z=7
---8 times---
x=8 y=1 z=8
---9 times---
x=9 y=1 z=9
---10 times---
x=10 y=1 z=10

内部変数yはループのたびに1がセットされるのに対して、
大域変数zや静的変数xはセットされた値が保持されるため、1ずつインクリメントされていくのである。