发布日期:2015-12-08 09:17 来源: 标签: 编程语言 C++教程 C++变量 C++静态变量
静态变量是存放在内存中的静态存储区。编译系统为其分配固定的存储空间,重复使用时,变量的值保留。静态变量有两种:一种是外部静态变量,另一种是内部静态变量。
静态变量是存放在内存中的静态存储区。编译系统为其分配固定的存储空间,重复使用时,变量的值保留。
静态变量定义的形式是:
static 类型标识符 变量名;
静态变量有两种:一种是外部静态变量,另一种是内部静态变量。
外部静态变量与外部变量有相似的地方,它是一种公用的全局变量,但作用域仅仅在定义它的那个文件中,出了该文件不管是否用extern说明都是不可见的。简单地讲,外部静态变量仅仅作用于定义它的一个文件,而外部变量作用于整个程序。
例9-23: 分析下列程序的运行结果。
/* 文件一 */
static int x=2; /* 说明外部静态变量x */
int y=3; /* 说明外部变量y */
extern void add2( ); /* 说明外部函数add2 */
void add1( ); /* 说明函数add2,则在同一文件所有调用add1的函数中,
可以不再进行函数返回类型的说明 */
main ( )
{ add1( ); add2( ); add1( ); add2( );
printf ("x=%d; y=%d\n", x, y);
}
void add1(void) /* 定义函数add1 */
{ x += 2; y += 3;
printf ("in add1 x=%d\n", x);
}
/* 文件二 */
static int x=10; /* 说明外部静态变量x */
void add2 (void) /* 定义函数add2 */
{ extern int y; /* 说明另一个文件中的外部变量y */
x += 10; y += 2;
printf ("in add2 x=%d\n", x);
}
  程序的文件一中定义了外部静态变量x,它的作用域仅仅是文件一。外部变量y的作用域是整个程序。而在文件二中,定义了另一个外部静态变量x,它的作用域仅在第二个文件,它与文件一中的外部静态变量x毫无关系。
执行程序调用add1函数,x=x+2=2+2=4,y=y+3=3+3=6。调用add2函数,执行x+=10,此时add2中的x是文件二中的外部静态变量,所以x取值为10,x=x+10=10+10=20,而y为外部变量,y=y+2=6+2=8。再次调用add1函数,此时x=x+2应当是文件一的外部静态变量,x取值为4,x=x+2=4+2=6;执行y=y+3=8+3=11,再次调用add2执行语句x=x+10=20+10=30;执行语句y=y+2=11+2=13;所以打印结果为:
in add1 x=4
in add2 x=20
in add1 x=6
in add2 x=30
x=6; y=13
  内部静态变量与自动变量有相似之处。内部静态变量也是局限于一个特定的函数,出了定义它的函数,即使对于同一文件中的其它函数也是不可见的。但它又不象自动变量那样,仅当定义自动变量的函数被调用时才存在,退出函数调用就消失。内部静态变量是始终存在的,当函数被调用退出后,内部静态变量会保存数值,再次调用该函数时,以前调用时的数值仍然保留着。编译系统为函数的内部静态变量分配专用的永久性的存储单元。
例9-24:分析下列程序的运行结果。
main ( )
{ void inc1( ), inc2( );
inc1( ); inc1( ); inc1( );
inc2( ); inc2( ); inc2( );
}
void inc1( )
{ int x=0; /* 说明自动变量x并赋初值 */
x++;
printf ("in inc1 x=%d\n", x);
}
void inc2( )
{ static int x=0; /* 说明内部静态变量x并初始化 */
x++;
printf ("in inc2 x=%d\n", x);
}
  函数main分别三次调用函数inc1和inc2,在函数inc1中定义了自动变量x,在inc2中定义了内部静态变量x。连续三次调用inc1时,打印的结果一定为:
in inc1 x=1;
而三次调用inc2的结果就不一样了。第一次调用inc2,内部静态变量x=1;由于x为内部静态变量,故第二次调用inc2时,x仍保留第一次退出inc2时的值不变。所以第二次调用inc2,在inc2内部x=2,同理第三次调用inc2,在其内部x=3。程序运行结果为:
in inc1 x=1
in inc1 x=1
in inc1 x=1
in inc2 x=1
in inc2 x=2
in inc2 x=3
  要特别注意变量赋初值与初始化的区别。虽然inc2中第一个语句是"static int x=0",但它与语句"int x=0;"的含义是不一样的。对于自动变量来说,"int x=0;"的含义是对变量赋初值,该语句实际上等价于下列两个语句:
int x; /* 说明变量 */
x=0; /* 执行赋值操作为变量赋初值 */
为变量赋初值的操作要在函数被调用执行时才能进行。
  对于内部静态变量,"static int x=0"的含义是说明一个静态变量并进行初始化。初始化与赋初值不同,它是在程序运行之前,由编译程序一次性为变量赋的初值"x=0";而在实际运行时不用再执行赋值操作。
在一般情况下,函数都是外部的,其名字在整个程序都是可见的。但也可以将函数说明为静态的,使它仅在定义它的文件内部有效。说明静态函数时,可在函数类型前加static进行限制。使用静态函数同外部静态变量一样,都可以保证其正确的作用域。

相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。