①下述程序中使用了全局变量以及具有static存储类别的变量
1
#include<iostream>
2
using namespace std;
3
int i=5;
4
void func(void);
5
int main()
6
{
7
static int a;
8
int b=-22;
9
int c=0;
10
cout<<"-------main-------"<<endl;
11
cout<<"i="<<i<<","<<"a="<<a<<","
12
<<"b="<<b<<","<<"c="<<c<<endl;
13
c=c+10;
14
func();
15
cout<<"------main()------"<<endl;
16
cout<<"i="<<i<<","<<"a="<<a<<","
17
<<"b="<<b<<","<<"c="<<c<<endl;
18
i=i+12;
19
func();
20
return 0;
21
}
22
void func(void)
23
{
24
static int a=3;
25
static int b;
26
int c=10;
27
a=a+2;
28
i=i+21;
29
c=c+6;
30
cout<<"------func()------"<<endl;
31
cout<<"i="<<i<<","<<"a="<<a<<","
32
<<"b="<<b<<","<<"c="<<c<<endl;
33
b=a;
34
}
35
运行结果为:
------main()------
i=5,a=0,b=-22,c=0
------func()------
i=26,a=5,b=0,c=16
------main()------
i=26,a=0,b=-22,c=10
------func()------
i=59,a=7,b=5,c=16
结果分析:
静态(static)局部变量与自动(auto)局部变量的使用区别:它们的作用域都是局部的,作用域外都是不可见的;但静态局部变量在
其作用域外仍是存在的(尚且"活着",其存储单元中的值并不被破坏,仍可在下次进入作用域后接着用!即具有全局变量取值
"连续性"的特征),而自动局部变量在其作用域外则不复存在(已经"死亡",其存储单元已经被系统回收!当然不可接着使用该
变量的原有值,下次进入该作用域后重新分配存储空间)。另外注意:静态变量仅在首次"遇到"时分配存储空间并进行初始化
(若没显式提供初始化值时,系统自动将其初始化为系统隐含值,即将数值量初始化为0,将字符量初始化为空格)。
②
1
#include<iostream>
2
#include"median.cpp"
3
using namespace std;
4
int i=1111;
5
char ch='+';
6
void func1();
7
void func2();
8
9
int main()
10
{
11
func1();
12
cout<<"file1_main:i,ch=>"<<i<<","<<ch<<endl;
13
func2();
14
cout<<"file2_main:i,ch=>"<<i<<","<<ch<<endl;
15
return 0;
16
}
17
18
void func1()
19
{
20
cout<<"file1_func1:i,ch=>"<<i<<","<<ch<<endl;
21
i=2222;
22
ch='-';
23
}
24
25
//extern型外部变量的使用"median.cpp"//
26
#include<iostream>
27
using namespace std;
28
extern int i;
29
extern char ch;
30
void func2()
31
{
32
cout<<"file2_func2:i,ch=>"<<i<<","<<ch<<endl;
33
i=3333;
34
ch='*';
35
}
36
运行结果:
file1_func1:i,ch=>1111,+
file1_main:i,ch=>2222,-
file2_func2:i,ch=>2222,-
file2_main:i,ch=>3333,*
分析:
外部变量的使用,可以使得在不同的源程序文件之间进行变量值的相互传递。
通过extern关键字来对外部变量进行说明,系统仅在其中某一个文件的外部变量定义处为其分配存储空间,而在
其他文件中则不再分配,但与定义处的那一同名变量共享同一存储空间,以达到多文件之间变量值相互传递的目的。