①下述程序中使用了全局变量以及具有static存储类别的变量
1#include<iostream>
2using namespace std;
3int i=5;
4void func(void);
5int 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}
22void 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"
3using namespace std;
4int i=1111;
5char ch='+';
6void func1();
7void func2();
8
9int 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
18void 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>
27using namespace std;
28extern int i;
29extern char ch;
30void 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关键字来对外部变量进行说明,系统仅在其中某一个文件的外部变量定义处为其分配存储空间,而在
其他文件中则不再分配,但与定义处的那一同名变量共享同一存储空间,以达到多文件之间变量值相互传递的目的。