第10讲变量的存储类别和预处理

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第10讲变量的存储类型、预处理数据类型:指变量的名称、类型、取值范围和占据存贮空间的大小。如整型,实型,字符型等。变量定义的一般形式:存储类型数据类型变量名称;说明:存储类型可以是auto、static、register和extern。对变量的定义需要给出下面两方面的属性:存储类型:变量存在的时间(生存期)、作用范围和在硬件中存放的地点(区域)。一、变量的存储类型(方式)(P218)1、auto自动变量(P219)main(){intx,y;······}inthanshu(autointa){autointb,c,d;······}C语言规定:在局部变量的定义中,可省略关键字auto。即:没有指明存储类别的变量,一律隐含为自动变量。例如:用关键字auto作存储类型说明的局部变量(包括形参)称为自动变量。变量的生存期为定义它的函数。2、static静态变量(P219)inthanshu(inta){staticintb,c,d;······}静态变量存放在静态存储区,一旦为其分配了存储单元,它们在整个程序执行期间将固定地占用这些存储单元。即:变量的生存期为整个程序。用static作存储类型说明的局部变量称为静态变量。#includestdio.hvoidf(intn){autoints=10;//auto可省略s=s+1;printf(s=%d\n,s);}voidmain(){intn;for(n=1;n4;n++)f(n);}程运行结果:s=11s=11s=11例1写出下面程序的执行结果(自动变量的生存期)#includestdio.hvoidf(intn){staticints=10;//静态变量s=s+1;printf(s=%d\n,s);}voidmain(){intn;for(n=1;n4;n++)f(n);}程运行结果:s=11s=12s=13例2写出下面程序的执行结果(静态变量的生存期)区别1:自动变量的值在函数调用结束后不再保留,下次调用时丢失了原有的值。因此,每次调用函数时,都要初始化。静态局部变量在函数调用结束后,仍然保留上次调用结束时的值(存在但不一定能使用)。因此,只有在第1次调用函数时才初始化。区别2:自动变量在函数中如果不初始化,它的初值为一个不确定的值。静态局部变量在函数中如果不初始化,它的初值为0。自动变量和静态局部变量区别:#includestdio.hvoidf(){autoints;//auto可省略s=s+1;printf(s=%d\n,s);}voidmain(){intn;for(n=1;n4;n++)f();}程运行结果:s=××s=××s=××例3写出下面程序的执行结果(自动变量未初始化)#includestdio.hvoidf(){staticints;//静态变量s=s+1;printf(s=%d\n,s);}voidmain(){intn;for(n=1;n=3;n++)f();}程运行结果:s=1s=2s=3例4写出下面程序的执行结果(静态变量的未初始化)#includestdio.hvoidf(){staticints=10;//静态变量s=s+1;printf(s=%d\n,s);}voidmain(){f();printf(s=%d\n,s);}例5指出下面程序中的错误错误:变量s不能在主函数中使用。请特别注意:区分静态变量的生存期和作用域。3、register寄存器变量(P221)说明:(1)寄存器变量只能用于基本整型变量、短整型整型变量和字符型变量。(2)寄存器变量的分配方式是动态分配的。(3)由于CPU中的通用寄存器数目有限,通常只把少数使用频繁的变量定义为寄存器变量。对超出寄存器数目的寄存器变量作一般自动变量处理。用register作存储类型说明的局部变量。其作用是加快速度。(寄存器在CPU中,其余的变量存放在内存中)。#includestdio.hintfac(intn){registerinti,f=1;/*定义i,f为寄存器变量*/for(i=1;i=n;i++)f=f*i;returnf;}main(){intk;for(k=1;k=5;k++)printf(%d!=%d\n,k,fac(k));}例求n!的函数。#includestdio.hintfunc(inta,intb){intc;c=a+b;returnc;}voidmain(){intx=6,y=7,z=8,r;r=func((x--,y++,x+y),z--);printf(r=%d\n,r);}提示:主函数中的表达式:x--,y++,x+y的值为13。例写出下面程序的执行结果(静态变量的生存期)程运行结果:r=21#includestdio.hintfunc(inta,intb){staticintm=0,i=2;i+=m+1;m=i+a+b;returnm;}voidmain(){intk=4,m=1,p;p=func(k,m);printf(p=%d\n,p);p=func(k,m);printf(p=%d\n,p);}程运行结果:p=8p=17例写出下面程序的执行结果(静态变量的生存期)#includestdio.hintf2(inta,intb){a++;b++;returnb;}intf1(intx,inty){intn=0,b=0;staticinta=0;a=a+x;b=b+y;f2(a,b);printf(%d,%d,%d\n,n,a,b);returna;}voidmain(){intn=1,a=2,b=3,i;for(i=0;i2;i++){a=f1(a,b);b=f2(a,b);printf(%d,%d,%d\n,n,a,b);}}程运行结果:0,2,31,2,40,4,41,4,5例写出下面程序的执行结果。4、extern外部变量(p221)用关键字extern作存储类型说明的变量称为外部变量。外部变量与全局变量是对同一类变量的两种不同角度的提法。全局变量是从作用域的角度,用来表示变量的作用范围,而外部变量是从变量是从存储类型的角度提出的,用来表示变量的生存期。C语言规定:1)对共用的外部变量可以在任一源文件中定义一次,其他源文件中用extern对其声明后,即可使用。3)外部变量的声明可以有多次,其位置在定义点之前任意处,不需要分配存储空间。4)外部变量的定义只有一次,其位置只能在函数外,并可对外部变量分配存储单元,初始化。2)如果希望某些外部变量仅限于本文件使用,则在定义外部变量时前面加一个static说明。称为静态局部变量。#includestdio.hintmax(inta,intb){intc;c=ab?a:b;returnc;}voidmain(){externx,y;/*声明外部变量*/printf(%d\n,max(x,y));}intx=12,y=-8;/*定义外部变量*/例1外部变量使用举例(在同一源文件内)程运行结果:12注意:如果省略了主函数中的外部变量声明,程序将出现编译错误,违法了变量先定义后使用的规则。//文件1:f1.cpp#includestdio.h#includec:\user\f2.cintx;//定义外部变量main(){inta=3,b=4;x=a;printf(%d\n,pow1(b));}例2外部变量使用举例(在两个文件中)求ab。//文件2:f2.cppexternintx;/*声明外部变量*/intpow1(intn){inti,y=1;for(i=1;i=n;i++)y=y*X;returny;}程运行结果:811、概念:用标识符来表示一个字符串,标识符叫宏名。2、无参宏定义1)无参宏定义的一般格式:#define标识符字符串例如:#definePI3.141592)作用:在宏定义之后,凡是该标识符出现的地方用对应的字符串来代替。上面的定义之后,凡是PI都用3.14159来代替。二、宏定义:(P243)例输入半径,计算以该半径为圆的周长与圆面积、球的体积与表面积。#includestdio.h#definePI3.14159voidmain(){floatr,yzc,ymj,qbmj,qtj;scanf(%f,&r);yzc=2*PI*r;ymj=PI*r*r;qbmj=4*PI*r*r;qtj=4*PI*r*r*r/3;printf(%f,%f,%f,%f\n,yzc,ymj,qbmj,qtj);}3、带参数的宏定义(P245)1)带参宏定义的一般格式:#define标识符(参数表)字符串例如:#defineADD(x,y)x+y2)作用:在宏定义之后,凡是该标识符出现的地方用对应的字符串来代替,参数也作相应的替换。上面的定义之后,程序中如果出现ADD(4,5),则用4+5来代替,出现ADD(a,b),则用a+b来代替。#includestdio.h#definePI3.14159#defineAREA(r)PI*r*rvoidmain(){floatx,s;x=10.0;s=AREA(x);printf(s=%.1f\n,s);}写出下面程序的结果。执行结果:s=314.2#includestdio.h#defineADD(x,y)x+y#defineMAX(x,y)xy?x:yvoidmain(){inta=4,b=5,c,d;c=ADD(a,b);d=MAX(a,b);printf(c=%d\td=%d\n,c,d);floatw,z;w=ADD(5.6,-5.8);z=MAX(5.6,-5.8);printf(w=%.1f\tz=%.1f\n,w,z);}写出下面程序的结果。执行结果:c=5d=5w=-0.2z=5.6写出下面程序的结果。#includestdio.h#defineMUL(x,y)x*yvoidmain(){inta=3,b=4,c=5,d=6,m1,m2;m1=MUL(a,b);m2=MUL(a+b,c+d);printf(m1=%d\n,m1);printf(m2=%d\n,m2);}执行结果:m1=12m2=29修改方法1:#includestdio.h#defineMUL(x,y)(x)*(y)voidmain(){inta=3,b=4,c=5,d=6,m1,m2;m1=MUL(a,b);m2=MUL(a+b,c+d);printf(m1=%d\n,m1);printf(m2=%d\n,m2);}执行结果:m1=12m2=77修改方法2:#includestdio.h#defineMUL(x,y)x*yvoidmain(){inta=3,b=4,c=5,d=6,m1,m2;m1=MUL(a,b);m2=MUL((a+b),(c+d));printf(m1=%d\n,m1);printf(m2=%d\n,m2);}执行结果:m1=12m2=771、文件包含是C语言的一个重要功能,其作用是将另外一个文件的内容包含进来。C语言使用#include来实现,命令格式:#include文件名#include文件名例如:#includestdio.h#includestdio.h2、文件包含通常用来解决程序使用C的库函数和公共符号常量的问题。例如:sqrt()函数、EOF。三、文件包含(P246)3、两种格式的区别#include“文件名”表示先在源程序文件的当前目录下查找文件,如果当前目录下未找到文件再到包含目录下查找。#include文件名表示只在包含目录下查找。包含目录是编译系统的一个参数,在VC6.0下通过“工具”菜单中的“选项”、“目录”来查询与设置,而在DEVC++下通过“工具”菜单中的“编译选项”、“目录”、“C包含文件”来查询与设置。条件编译指令将决定那些代码被编译,而哪些是不被编译的。可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功