在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
原链接:http://gaga.yo2.cn/articles/detailed-c-language-variables-review.html 刚做题时发现全局变量会自动初始化,如int型则自动初始化为0,double则初始化为0.000000....。而局部变量如果没有初始化的话,初值为一随机数。于是很好奇,找了点资料,发现果然如此。
一。变量的存储类型 C语言中的变量存储类型有4种,分别为auto(自动变量),static(静态变量),extern(外部变量),register(寄存器变量) 1.全局变量的存储类型: static和extern两种,其中extern是缺省的全局变量存储类型。 int x,y=5;//默认为外部全局变量 extern int a=1,b=2;//定义外部全局变量,使用关键字extern后,必须进行初始化! static float f1,f2;//静态全局变量 void main() { .......... } extern型全局变量通过外部全局变量说明可以被其他源程序引用,而static星的全局变量只能局限在本源程序文件中使用 如果使用了关键字extern,则必须对这个外部全局变量进行出示化,否则编译程序会把它当作外部变量的声明(说明) 2.局部变量的存储类型: C语言种的局部变量的存储类型有如下3种:auto,static,register。其中auto是缺省的局部变量存储类型! void main() { auto int a;//自动变量 fioat f;//自动变量 static int i;//静态变量 register double d;//寄存器变量,要求编译器使用CPU寄存器来存储变量值 } C语言函数定义中的形参也是局部变量,形参的默认存储类型是auto,也可以指定形参的存储类型是register,但不允许指定形参的村塾类型为static! 二。变量的生存期 C语言的变量生存期有2种:全程生存期,动态生存期。 1.全程生存期 指变量在程序运行一开始就被建立,而在程序运行结束后才从内存中删除。 具有全程生存期的变量是全局变量和静态变量 具有全程生存期的变量存储在程序的静态数据存储区中 2.动态生存期 指变量在程序运行过程中,因需要使用才建立,而使用结束就被删除 具有动态生存期的变量有:局部自动变量,寄存器变量 具有动态生存期的变量存储在程序的动态数据区中 对于复合语句种定义的auto型的局部变量,每当程序运行至该语句时,就会在动态数据区建立这些局部变量的存储空间,而一旦程序流程离开该复合语句时,该复合语句种的局部变量将被系统从内存种删除 3.变量的初始化 具有全局生存期的变量(包括数组)在定义时如果没有初始化,则初值自动为0;而具有动态生存期的变量未初始化时,初值为一随机数! 具有全局生存期的变量在定义时如有初始化,则初始化在程序刚开始运行建立静态数据区时会被执行一次,以后再也不会执行初始化操作。而动态生存期的变量在定义时如有初始化,则每当程序创建该变量时都会执行初始化。
static double a[10]; int b[5];double x,y;static char ch; void main() { static long p[8]; static float g; } 上述变量都为全局生存期变量,所以初值都时0! 注意:如果在函数中使用静态局部变量,由于静态局部变量的初始化只执行一次,故当第2次调用该函数时,不会对静态局部变量进行再次初始化;又由于静态局部变量时全程生存期的,所以静态局部变量的值为上次结束函数调用时的值! #include "stdio.h" void f() { int a =0;//自动局部变量 static int c;//静态局部变量 a++;c++; printf("%d,%d,",a,c) } void main() { int k; for(k=1;k<=4;k++) f(); } 输出结果:1,1,1,2,1,3,1,4 解析: 由于a时自动变量,即为动态生存期变量,所以每次调用函数f()时都要进行初始化,故每次输出都时1。 而b为静态局部变量,即为全局生存期变量,所以只是在第一次调用函数f()时进行初始化,在接下来函数f的调用中 b的值为上次函数结束时的值
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论