
9.4变量的作用域和生存期1变量的作用域一个程序中定义的变量,只有在一定的范围之内才是有效的,这个范围称为该变量的作用域,局部变量和全局变量
9.4 变量的作用域和生存期 1 变量的作用域 一个程序中定义的变量,只有在一定的范围之内才 是有效的,这个范围称为该变量的作用域。 局部变量和全局变量

o局部变量凡是在函数内部定义的变量,都是局部变量。其作用域:从定义点开始到函数体或复合语句的末尾。形参、复合语句中定义的变量、main函数中定义的变量均是局部变量#include main()long fac(int k)int m, n;long p; ←long c; ←int i;←p=1;scanf("%d%d",&m, &n) ;for(i=l;i<=k;i++)c=fac(m) / (fac (n)*fac(m-n))p=p*i;printf("%ld\n",c);return p;+
局部变量 凡是在函数内部定义的变量,都是局部变量。 其作用域:从定义点开始到函数体或复合语句的末尾。 形参、复合语句中定义的变量、main函数中定义的变量均是局部变量 #include long fac(int k) { long p; int i; p=1; for(i=1;i<=k;i++) p=p*i; return p; } main() { int m,n; long c; scanf("%d%d",&m,&n); c=fac(m)/(fac(n)*fac(m-n)); printf("%ld\n",c); }

错例正确#include #include main()main()((int a,b;int a,b;scanf("%d%d", &a, &b) :scanf("%d%d",&a,&b);{ int t;[int t;t=a;t=a;a=b;a=b;b=t;b=t;1printf("t=%dn",t);printf("t=%d(n", t);printf("a=%d, b=%d\n",a, b) ;printf("a=%d, b=%d\n", a, b)1J1C2065: 't' : undeclared identifiererror
#include main( ) { int a,b; scanf("%d%d",&a,&b); { int t; t=a; a=b; b=t; } printf("t=%d\n",t); printf("a=%d,b=%d\n",a,b); } #include main( ) { int a,b; scanf("%d%d",&a,&b); { int t; t=a; a=b; b=t; printf("t=%d\n",t); } printf("a=%d,b=%d\n",a,b); } 错例 正确

全局变量?C语言程序中,凡是在函数外部定义的变量,都是全局变量。其作用域:从其定义点开始至本程序文件末尾例,编写一个求圆面积的被调函数以及调用它求圆环面积的主函数。mainOfloat area(float r) floatr1,r2,s0;float s;scanf("%f%f",&r1,&r2);s=3.14159*r*r;s0=area(r1)-area(r2);return s;7printf("圆环面积=%f\n",sO);1f利用实参->形参实现函数之间的数据传递!
全局变量 C语言程序中,凡是在函数外部定义的变量,都是全局变量。 其作用域:从其定义点开始至本程序文件末尾。 例 编写一个求圆面积的被调函数以及调用它求圆环面积的主 函数。 float area(float r) { float s; s=3.14159*r*r; return s; } main() { float r1,r2,s0; scanf("%f%f",&r1,&r2); s0=area(r1)-area(r2); printf("圆环面积=%f\n",s0); } 利用 实参-→形参 实现函数之间的数据传递!

main ()#include (float r1l,r2,sl,s2,s0;float r, s;scanf("%f%f",&rl,&r2);void area()r=r1;s=3.14159*r*r;area( ;return;s1=s;1r=r2;area( ;s2=s;利用全局变量s0=s1-s2:实现函数之间的数据传递!printf("圆环面积=%f\n",so);1
#include float r,s; void area() { s=3.14159*r*r; return; } main() { float r1,r2,s1,s2,s0; scanf("%f%f",&r1,&r2); r=r1; area(); s1=s; r=r2; area(); s2=s; s0=s1-s2; printf("圆环面积=%f\n",s0); } 利用 全局变量 实现函数之间的数据传递!

利用被调函数的返回值,只能将一个数据传回到主调函数中。而利用多个全局变量,则可以将多个数据传回到主调函数中。不过,使用全局变量增加了函数之间的耦合性(即函数之间的相互影响性),故应尽量少用全局变量
利用被调函数的返回值,只能将一个数据传回到主 调函数中。而利用多个全局变量,则可以将多个数据传 回到主调函数中。 不过,使用全局变量增加了函数之间的耦合性(即 函数之间的相互影响性),故应尽量少用全局变量

在C语言中,允许具有不同作用域的两个变量重名。全局变量与局部变量重名时,在该局部变量的作用域内,同名的全局变量将被屏蔽例同名变量的屏蔽。#include 运行结果为:int a=100:main(内层的a=200int a;外层的a=100a=200;printf("内层的a=%d\n",a);7printf("外层的a=%d\n",a);
在C语言中,允许具有不同作用域的两个变量重名。 全局变量与局部变量重名时,在该局部变量的作用域内,同 名的全局变量将被屏蔽。 例 同名变量的屏蔽。 #include int a=100; main() { { int a; a=200; printf("内层的a=%d\n",a); } printf("外层的a=%d\n",a); } 运行结果为: 内层的a=200 外层的a=100

变量的存储方式2从空间角度来看,变量可以分为全局变量和局部变量,而从时间角度来分可以有静态存储变量和动态存储变量之分。静态存储方式的变量,在整个程序运行期间,将始终占据内存空间。动态存储方式的变量,在程序运行期间,将动态地分配与回收内存空间
2 变量的存储方式 从空间角度来看,变量可以分为全局变量和局部 变量,而从时间角度来分可以有静态存储变量和动态 存储变量之分。 静态存储方式的变量,在整个程序运行期间,将 始终占据内存空间。 动态存储方式的变量,在程序运行期间,将动态 地分配与回收内存空间

局部变量的存储方式C语言中的变量共有四种存储类别即auto、register、static和extern局部变量既可以采用动态存储方式,也可以采用静态存储方式。具体来说,局部变量有三种存储类别1.auto变量(自动变量)2.register变量(寄存器变量)(静态局部变量)3.static局部变量
C语言中的变量共有四种存储类别 即auto、register、static和extern 局部变量既可以采用动态存储方式,也可以采用 静态存储方式。具体来说,局部变量有三种存储类别: 1. auto变量(自动变量) 2. register变量(寄存器变量) 3. static局部变量(静态局部变量) 局部变量的存储方式

1.auto变量(自动变量)auto变量在所属函数被调用时,分配内存空间:在该函数返回时,自动释放内存空间未定义存储类别的局部变量,均视为auto变量,如:inta,b:3.static局部变量(静态局部变量)静态局部变量的存储空间,在函数返回时并不释放,而一直保持到整个程序运行结束静态局部变量在编译时进行初始化,且只进行一次初始化未经赋值的静态局部变量,系统自动初始化为0。定义静态局部变量的格式:类型说明符变量名:static
1.auto变量(自动变量) auto变量在所属函数被调用时,分配内存空间;在该 函数返回时,自动释放内存空间 未定义存储类别的局部变量,均视为auto变量, 如:int a,b; 2. register变量 程序运行时,将优先把register变量存入CPU寄存器,以提高访问 速度。 一般编译系统都能自动优化寄存器的分配,故定义register变 量已无必要。 3. static局部变量(静态局部变量) 静态局部变量的存储空间,在函数返回时并不释放, 而一直保持到整个程序运行结束。 静态局部变量在编译时进行初始化,且只进行一次初始化。 未经赋值的静态局部变量,系统自动初始化为0。 定义静态局部变量的格式: static 类型说明符 变量名;