变量的作用域、存储类别2020年2月25日星期二5时16分44秒变量的属性:数据类型。存储属性。变量定义完整格式:[存储类型]数据类型变量表;内存的存储空间变量存储在内存中不同的存储区域2020年2月25日星期二5时16分44秒–auto-----自动型–register-----寄存器型–static------静态型–extern-----外部型变量、数组、函数等都具有存储类别的属性。定义时都可对其存储类别进行定义。C语言中提供了四种存储类别:四种存储类别有两种存储期:静态存储期、动态存储期2020年2月25日星期二5时16分44秒–auto-----自动型–register-----寄存器型–static------静态型–extern-----外部型动态存储:调用函数时才为本函数内的自动型变量或寄存器型变量分配单元,函数调用结束其值自动消失。静态存储:程序执行开始至结束,始终占用该存储空间,变量末赋值时,编译系统自动赋0值。动态存储静态存储若省略存储类别时,都视为自动型2020年2月25日星期二5时16分44秒变量的作用域变量存储在内存中不同的存储区域,将影响变量值的存在时间(即生存期)。变量的生存期指程序在执行期间,变量存在的时间间隔,即从给变量分配内存至所分配内存被系统收回的那段时间。在C语言中,变量的作用域是由变量的存储类型和定义位置决定的。2020年2月25日星期二5时16分44秒局部变量——内部变量定义:在函数模块内定义的,且只在本函数模块内有效。说明:1、main中定义的变量只在main中有效2、不同函数中同名变量,占不同内存单元3、形参属于局部变量4、在复合语句中定义的有效变量5、局部变量可用存储类型:autoregisterstatic(默认为auto)局部变量floatf1(inta){intb,c;…….}charf2(intx,inty){staticinta,j;……}main(){intm,n;…….}a,b,c有效x,y,a,j有效m,n有效2020年2月25日星期二5时16分44秒局部变量main(){inta,b;a=3;b=4;printf(main:a=%d,b=%d\n,a,b);sub();printf(main:a=%d,b=%d\n,a,b);}sub(){inta,b;a=6;b=7;printf(sub:a=%d,b=%d\n,a,b);}main:a=3,b=4sub:a=6,b=7main:a=3,b=42020年2月25日星期二5时16分44秒#includestdio.hmain(){inta=1,b=2,c=3;++a;c+=++b;{intb=4,c;c=b*3;a+=c;printf(first:%d,%d,%d\n,a,b,c);b+=a+c;printf(second:%d,%d,%d\n,a,b,c);}printf(third:%d,%d,%d\n,a,b,c);}12312345a=1b=2c=3123b=4c12345236121414,4,123014,30,1214,3,6写出下列程序的运行结果在复合语句中可以重新对变量进行数据类型的定义。复合语句first:14,4,12second:14,30,12third:14,3,6局部变量2020年2月25日星期二5时16分44秒局部变量main(){inti=1,j=3;printf(%d,,i++);{inti=0;i+=j*2;printf(%d,%d,,i,j);}printf(%d,%d\n,i,j);}复合语句inti=0;1,6,3,2,32020年2月25日星期二5时16分44秒全局变量---外部变量定义:在函数外定义,可为本文件所有函数共用变量的作用域(有效范围):从定义变量的位置开始到本源文件结束为止。全局变量全局变量的作用域的特点:①在全局变量与局部变量不同名时,其作用域是整个程序。②在全局变量和局部变量同名时,在同名局部变量的作用域内,全局变量不起作用。2020年2月25日星期二5时16分44秒#includestdio.hinta=3,b=6;main(){intc;c=++a+b++;func(c);printf(a=%d,b=%d\n,a,b);}func(inta){b=a%b;printf(a=%d,b=%d\n,a,b);}当外部变量与局部变量同名,则在局部变量的作用域内,外部变量不起作用。全局变量的定义局部变量a=10,b=3a=4,b=32020年2月25日星期二5时16分44秒intm=13;intfun(intx,inty){intm=3;return(x*y-m);}main(){inta=7,b=5;printf(%d\n,fun(a,b)/m);}全局变量全局变量局部变量22020年2月25日星期二5时16分44秒intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范围p,q的作用范围externcharc1,c2;externcharc1,c2;c1,c2的作用范围扩展后外部变量说明:extern数据类型变量表;c1,c2的作用范围扩展后若外部变量与局部变量同名,局部变量优先。2020年2月25日星期二5时16分44秒例外部变量定义与说明intmax(inta,intb){intz;z=ab?a:b;return(z);}main(){printf(max=%d,max(a,b));}inta=13,b=-8;运行结果:max=13externinta,b;intmax(){intz;z=ab?a:b;return(z);}main(){printf(max=%d,max());}inta=13,b=-8;externinta,b;2020年2月25日星期二5时16分44秒#includestdio.hinta=10,b=20,x=30;main(){sub1(a);sub2(a);sub1(b);sub3();sub3();printf('END:'%5d%5d%5d\n,a,b,x);}sub1(intx){staticinta=5;a+=x;printf('sub1:'%5d%5d\n,a,x);}sub2(intx){x=a;printf('sub2:'%5d\n,x);}sub3(){inta=0;printf('sub3:'%5d%5d%5d\n,a,b,x);x=b;}写出下列程序的运行结果‘sub1:’1510‘sub2:’10‘sub1:’3520‘sub3:’02030‘sub3:’02020‘END:’102020区分全局变量和局部变量。2020年2月25日星期二5时16分44秒静态存储变量对静态存储变量,若定义时赋初值,则程序运行中仅在第一次调用时赋初值,下一次调用不再赋初值,而是使用上一次调用的值。对静态存储变量,若定义时不赋初值,则系统置初值0,而动态变量不赋初值则值不确定。2020年2月25日星期二5时16分44秒main(){inta=2,j;for(j=0;j3;j++)printf(%d,f(a));}f(inta){intb=0;staticc=0;b++;++c;return(a+b+c);}读下列程序的运行结果:4staticc=0;aj2for0j3ab20c01141201252201363564562020年2月25日星期二5时16分44秒阅读下列程序,写出其其运行结果:#includestdio.hinta=5,b=7;main(){inta=4,b=5,i;for(i=0;i3;i++)printf(%d,,pl(a,b));}pl(intx,inty){staticintz;z+=a+x+y;return(++z);}15,30,45,2020年2月25日星期二5时16分44秒例:有以下程序,程序运行后的输出结果是inta=2;intf(intn){staticinta=3;intt=0;if(n%2){staticinta=4;t+=a++;}else{staticinta=5;t+=a++;}returnt+a++;}main(){ints=a,i;for(i=0;i3;i++)s+=f(i);printf(%d\n,s);}29