计算机二级考试C语言辅导PPT课件共三部分:第三部分_第1页
计算机二级考试C语言辅导PPT课件共三部分:第三部分_第2页
计算机二级考试C语言辅导PPT课件共三部分:第三部分_第3页
计算机二级考试C语言辅导PPT课件共三部分:第三部分_第4页
计算机二级考试C语言辅导PPT课件共三部分:第三部分_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机二级考试c语言辅导共三部分:第三部分七、函数 1.库函数的正确调用。2.函数的定义方法。3.函数的类型和返回值。4.形式参数与实在参数,参数值传递。5.函数的正确调用,嵌套调用,递归调用。6.局部变量和全局变量。7.变量的存储类别(自动,静态,寄存器,外部),变量的作用域和生存期。调用格式1)1)函数语句函数语句: :把函数调用作为一个语句。把函数调用作为一个语句。 printf( );printf( );2) 2) 函数表达式函数表达式 函数出现在一个表达式中,这种表达式称为函数出现在一个表达式中,这种表达式称为函函数表达式数表达式。 这时要求函数带回一个确定的值以参加表达式这时要求函

2、数带回一个确定的值以参加表达式的运算。的运算。 例如:例如: c=2c=2* *sin(a);sin(a);3) 函数参数函数参数 函数调用作为一个函数的实参。函数调用作为一个函数的实参。 printf(“%d”,fabs(-1);printf(“%d”,fabs(-1);注意:头文件 定义格式 函数类型函数类型 函数名函数名( (参数类型参数类型 参数参数 名名, , , , 参数类型参数类型 参数名参数名) )1 1、 无参无参函数的定义形式函数的定义形式 类型标识符类型标识符 函数名()函数名() 声明部分声明部分 语句语句 2 2、 有参有参函数的定义形式函数的定义形式类型标识符类型标

3、识符 函数名(形式参数表列)函数名(形式参数表列) 声明部分声明部分 语句语句 print_message( )printf( “how do you do ! n” );int max( int x,int y ) int z ; z = x y ? x : y ; return( z ) ;main() int x,y; scanf(“%d”,&x); y=x*x;printf(“%d”,y) ;int fun(int a) int b; b=a*a; return(b);main() int x,y; scanf(“%d”,&x); y=fun(x);printf(“%d

4、”,y) ; 编写一个函数,由参数传入一个整数,计算该数的各位数字之积。main() int x,y,z=1; scanf(“%d”,&x); for( ;x!=0; ) y=x%10; z=z*y; x=x/10; printf(“%d”,z);说明:1)定义时部分可省,请注意省略后默认的含义 2)自定义函数定义的位置(任意位置) 3)不能嵌套定义(可以嵌套调用)int max(int x,int y) int min(int x,int y) return (xy?x:y) 一.函数类型 函数类型主要指的是函数返回值的类型,定义时确定1)如果在定义函数时不指定函数类型,系统会如果在

5、定义函数时不指定函数类型,系统会隐含指定函数类型为隐含指定函数类型为int型型 2)在定义函数时对函数说明的类型一般应该和在定义函数时对函数说明的类型一般应该和return语句中的表达式类语句中的表达式类型一致。如果不一致,则以函数类型为准。对数值数据,可以自动进行型一致。如果不一致,则以函数类型为准。对数值数据,可以自动进行转换。即函数类型决定返回值的类型。转换。即函数类型决定返回值的类型。 float f() int f() . return 1; return 1.5; 二二.函数的返回值函数的返回值 1)函数的返回值是通过函数中的return语句获得的。return 语句将被调用函数中

6、的一个确定的值带回主调函数中去 格式: return (表达式);或 return 表达式; 例: max(int x,int y) return(xy?x:y); 2)如果不需要从被调用函数带回函数值可以不要return语句或者return; 语 句。此时函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值。3)为了明确表示“不带回值”,可以用void(空类型或无类型)void printstar( ) void print_message( ) 则下面的用法就是错误的: a=printstar(); b=print_message();注意:如果出现多个 return 语句,且

7、不是出现在选择结构的各个分支中,则系统会自动执行第一个return语句,其它的不被执行main() main() . return 3; if (xy) return 1; return 6; else return 2;1) 以下关于return语句的叙述中正确的是(10.3) a)一个自定义函数中必须有一条return语句b)一个自定义函数中可以根据不同情况设置多条return语句c)定义成void类型的函数中可以有带返回值的return语句d)没有return语句的自定义函数在执行结束时不能返回到调用处b2)以下叙述中错误的是(08.9) a) 用户定义的函数中可以没有return语句

8、b)用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函数值 c)用户定义的函数中若没有return语句,则应当定义函数为void类型d)函数的return语句中可以没有表达式b3.参数1)类型:形参:各种基本类型变量、数组、指针变量实参:各种基本类型变量、常量、数组、数组元素、指针变量2)形参和实参必须个数相同、类型一致3)方式(1)值传递:形参变化不影响实参 int f(int a,int b) a=a*a; b=b*b; printf(“%d,%d”,a,b); main( ) int x=2,y=3; f(x,y); printf(“%d,%d”,x,y);(2)地址

9、传递2323xyab491).有以下程序#include void fun(int p) int d=2 ;p=d+; printf(“%d”,p);main()int a=1;fun (a); printf(“%dn”,a);程序运行后的输出结果是(09.9) a) 32 b) 12 c) 21 d) 22 c2)有以下程序 fun(int x,int y)return(x+y); main()int a=1,b=2,c=3,sum; sum=fun(a+,b+,a+b),c+); printf(“%dn”,sum);执行后的输出结果是(06 9)a) 6 b) 7 c) 8 d) 9c3)

10、若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是(07.9)a)函数的实参和其对应的形参共占同一存储单元b)形参只是形式上的存在,不占用具体存储单元c)同名的实参和形参占同一存储单元d)函数的形参和实参分别占用不同的存储单元d4)下面的函数调用语句中func函数的实参个数是 (08 9) func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8);a)3 b) 4 c) 5 d) 8a一.函数调用函数调用的一般形式为函数调用的一般形式为 函数名(函数名( 实参表列实参表列 )1)1)如果是调用无参函数,则如果是调用无参函数,则“实参表列实参表列”可可以没

11、有,但以没有,但括弧不能省略,括弧不能省略, 如果实参表列包含多个实参,则各参数间如果实参表列包含多个实参,则各参数间用逗号隔开。用逗号隔开。 实参与形参的个数应相等,类型应一致。实参与形参的个数应相等,类型应一致。 实参与形参按顺序对应,一实参与形参按顺序对应,一 一传递数据。一传递数据。int f( int x,int y) int f( int x,int y) . .main()main()int a=5,b=4;int a=5,b=4; f(a,b); f(a,b); 2)2)函数语句函数语句: :把函数调用作为一个语句。把函数调用作为一个语句。 print_star( );prin

12、t_star( );3) 3) 函数表达式函数表达式 函数出现在一个表达式中,这种表达式函数出现在一个表达式中,这种表达式称为称为函数表达式函数表达式。 这时要求函数带回一个确定的值以参加这时要求函数带回一个确定的值以参加表达式的运算。表达式的运算。 例如:例如: c=2c=2* *max(a,b);max(a,b);4) 函数参数函数参数 函数调用作为一个函数的实参。函数调用作为一个函数的实参。 m=max(a,max(b,c);m=max(a,max(b,c);又如:又如: printf(“%d”,max(a,b);printf(“%d”,max(a,b);5)5)被调函数的特点被调函数的

13、特点 (1) (1) 必须是已经存在的函数(是库函数或必须是已经存在的函数(是库函数或用户自己定义的函数)。用户自己定义的函数)。 (2)(2)如果使用库函数,一般还应该在本文件开如果使用库函数,一般还应该在本文件开头用头用#include#include命令命令 将调用有关库函数时所将调用有关库函数时所需用到的信息需用到的信息“包含包含”到本文件中来。到本文件中来。(3)(3)如果使用用户自己定义的函数,而且该函如果使用用户自己定义的函数,而且该函数与调用它的函数与调用它的函 数(即主调函数)在同一数(即主调函数)在同一个文件中个文件中, ,一般还应该在主调函数中对被调一般还应该在主调函数中

14、对被调用的函数作用的函数作声明声明,即向编译系统声明将要,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。调用此函数,并将有关信息通知编译系统。6)6)函数声明函数声明(1)(1)格式格式: : 函数类型函数类型 函数名(参数类型函数名(参数类型1 1,参数类,参数类型型2 2) 在函数声明中也可以不写形参名,而只写在函数声明中也可以不写形参名,而只写形参的类型。形参的类型。例例: float f(int a,int b);: float f(int a,int b); float f(int ,int ); float f(int ,int );(2)(2)位置位置: :在变量定义

15、之前或之后在变量定义之前或之后, ,但必须在其但必须在其它执行语句之前它执行语句之前(3)(3)省略省略: :函数类型为函数类型为intint或或char; char; 函数定义在函数定义在调用之前调用之前1)下列叙述中错误的是(06.4) a)c 程序必须由一个或一个以上的函数组成 b)函数调用可以作为一个独立的语句存在 c)若函数有返回值,必须通过 return 语句返回 d)函数形参的值也可以传回给对应的实参 d 下列给定的程序中,函数fun的功能是:计算并输出k以内最大的10个能被13或17整除的自然数之和。k的值由主函数传入,若k的值为500,则函数的值为4622。 请改正程序中的错

16、误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include #include #include int fun(int k) int m=0,mc=0, j; while(k=2)&(mc10) /*found*/ if(k%13=0)|(k%17=0) m=m+k;mc+; k-; /*found*/ return m; void main() system(cls); printf(%dn ,fun(500); 试题程序: #include #include #include #include double fun(

17、int n) void main() file *wf; system(cls); printf(s=%fn, fun(1000); /*/ wf=fopen(out.dat,w); fprintf(wf,%f,fun(1000); fclose(wf); /*/ 编写函数fun,它的功能是:求n以内(不包括n)同时能被5与11整除的所有自然数之和的平方根s,并作为函数值返回。 例如,n为1000时,函数值应为s=96.979379。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 二.特殊调用1)嵌套调用函数定义都是互相

18、平行、独立的函数定义都是互相平行、独立的, ,不能嵌套定义不能嵌套定义. .可以做嵌套调用函数,可以做嵌套调用函数, 在调用一个函数的过程中,又调用另一个函数。在调用一个函数的过程中,又调用另一个函数。求sum=1!+2!+3!+.+n! main( ) int x; scanf(“%d”,&z); printf(“%d”,h(z); int jc( int x) int j,s=1;for(j=1;j=x;j+) s=s*j; return s; int h(y) int i,sum=1; for (i=2;i = 3 )fibonacci 数列运行结果:112358 13 21 3

19、4 55 89 144 233 377 610 987 1597 2584 4181 6765 第几个月小兔子中兔子老兔子总数110012010131012411135212563238753513long f(int n) if (n=1|n=2) return 1; else return(f(n-1)+f(n-2);)main() int months=6; printf(“%ld”,f(months); 第一次调用 f(5) + f(4) f(4) + f(3) f(3) + f(2)f(3)+f(2)f(2)+f(1)f(2)+f(1)f(2)+f(1)main( ) long in

20、t f1,f2; int i; f1 =1;f2 =1; for (i=1;i=20;i+) printf(“%12ld%12ld”,f1,f2); if (i%2= =0)printf(“n”); f1 =f1+f2; f2 =f2+f1; main( ) int i;intf20=1,1;for(i=2,i=20;i+)fi=fi-1+fi-2;for(i=0,iy) temp=x;x=y;y=temp; temp=x*y; while(y%x)!=0) r=y%x; y=x; x=r; a=x; b=temp/a; printf(%d,%d,a,b); 辗转相除法 设两数为x、y(xy)

21、, 算法如下”1.y与x相除,若能整除,则为x,若不能整除,则y为x的值,x为它们的余数2.继续y与x相除,直至y能把x整除,则x即所求得最大公约数3.用x,y原值的积除以最大公约数则获得最小公倍数递归 main() int x,y,temp; scanf(“%d,%d”,&x,&y); if(xy) temp=x;x=y;y=temp; printf(“%d”,gy(x,y); gy(int n,int m) int g; if(n%m=0) return m; else g=gy(m,n%m); return g ;设x 30 y 211.m 21 n 30 g=gy(9,

22、21);=3return 32.m 9 n 21 g = gy(3,9); = 3return 33.m 3 n 9 return 3 请补充函数fun,函数fun的功能是求n的阶乘。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序: #include long fun(int n) if (【1】) return(n*fun(【2】); return【3】; void main() printf(10!=%ldn,fun(10); n1n-111)有以下程序#includeint fun(int a,in

23、t b) if(b=0) return a; else return(fun(-a,-b);main()printf(“%dn”,fun(4,2);程序运行结果是(08 9) a) 1 b) 2 c) 3 d) 4b2)#includeint f(int x,int y) return(y-x)*x); main() int a=3,b=4,c=5,d; d=f(f(a,b),f(a,c); printf(“%dn”,d); 程序运行结果(09 3) a) 10 b) 9 c) 8 d) 7 b变量的作用域和存储类别 1)作用域:局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内

24、在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为使用这些变量的。这称为“局部变量局部变量”。int sint s(1)=9;=9;int f(int x,int y) int s(2)=1; s=x*y; printf(“1=%dn”,s); return(s);main() int m=4,n=5,s(3); s=m-n; f(2,3); printf(“2=%dn”,s); int s(4)=7; printf(“3=%dn”,s);1=62=

25、-1;3=7;说明: (1)(1)主函数主函数mainmain中定义的变量(中定义的变量(m m,n n)也只)也只在主函数中有效,而不因为在主函数中定在主函数中有效,而不因为在主函数中定义而在任何函数中有效;主函数也不能使义而在任何函数中有效;主函数也不能使用其他函数中定义的变量。用其他函数中定义的变量。 (2)(2)不同函数中可以使用相同名字的变量,不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰,它们在它们代表不同的对象,互不干扰,它们在内存中占不同的单元内存中占不同的单元 (3)形式参数也是局部变量。形式参数也是局部变量。 (4)在一个函数内部,可以在复合语句中定在一个函

26、数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,义变量,这些变量只在本复合语句中有效,这种复合语句也可称为这种复合语句也可称为“分程序分程序”或或“程程序块序块”。全局变量全局变量 在函数之外定义的变量称为外部变量(全在函数之外定义的变量称为外部变量(全局变量、全程变量),全局变量可以为本局变量、全程变量),全局变量可以为本文件中其他函数所共用文件中其他函数所共用. .它的有效范围为从它的有效范围为从定义变量的位置开始到本源文件结束定义变量的位置开始到本源文件结束int s=1;int s=1;int f(int x,int y) s=x*y; printf(“1=%d”,s)

27、; return(s);main() int m=4,n=5; printf(“2=%d”,s);说明说明: 1)1)如果在一个函数中改变了全局变量的值,如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有就能影响到其他函数,相当于各个函数间有直接的传递通道。由于函数的直接的传递通道。由于函数的调用只能带回一个返回值,因此有时可以利用调用只能带回一个返回值,因此有时可以利用全局变量增加全局变量增加与函数联系的渠道,从函数得到一个以上的返与函数联系的渠道,从函数得到一个以上的返回值。回值。2)2)用用externextern声明外部变量声明外部变量一个文件内声明外部一个文件

28、内声明外部变量用变量用externextern来声明外部变量,以扩展外部来声明外部变量,以扩展外部变量的作用域变量的作用域存储类别:从变量存在的时间(即生存期)角度来分,从变量存在的时间(即生存期)角度来分, 可以分为静态静态存储方式和动态存储方式。可以分为静态静态存储方式和动态存储方式。(1) (1) 动态存储方式动态存储方式是在程序运行其间根据需要是在程序运行其间根据需要进行动态的分配存储空间的方式。进行动态的分配存储空间的方式。 auto auto 类型类型 变量名变量名 函数的局部变量,如不专门声明函数的局部变量,如不专门声明staticstatic存储类别,都是自动分配存储空间的,即

29、存储类别,都是自动分配存储空间的,即autoauto变量。数据存存储在动态存储区中。变量。数据存存储在动态存储区中。函数中的形参和在函数中定义的变量(包函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,括在复合语句中定义的变量),都属此类,在调用该函数系统会给它们分配存储空间,在调用该函数系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空在函数调用结束时就自动释放这些存储空间。间。寄存器变量寄存器变量 : :利用利用cpucpu的寄存器存储变量的寄存器存储变量, ,只能只能是整型是整型 字符型字符型 指针型的动态局部变量指针型的动态局部变量register

30、register 类型类型 变量名变量名 (2)(2)静态存储方式静态存储方式是指在程序运行其间分配固定是指在程序运行其间分配固定的存储空间的方式;的存储空间的方式; static static 类型类型 变量名变量名 函数中的局部变量的值在函数调用结束后函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。值,就是上一次函数调用结束时的值。注意注意:1):1)变量不赋初值时变量不赋初值时, ,系统默认为系统默认为0 0 2)

31、2)局部静态变量局部静态变量, ,超出它的作用域不产超出它的作用域不产生作用生作用, ,但内存空间不释放但内存空间不释放f()static int a; int b=0; a+;b+; printf(“%d”,a); printf(“%d”,b);main() int i; for(i=1;i=3;i+) f(); printf(“%d”,a);1)有以下程序#include int fun() static int x=1;x=x*2; return x;main()int i,s=1,for(i=1;i=2;i+) s=fun();printf(%dn,s);程序运行后的输出结果是(10.

32、3)a)0b)1c)4d)8c2)以下程序的运行结果是_ i=5 k=5 void fun(int m) m+=k;k+=m;printf(“m=%d =%d”,m,k+); main() int i=4; fun(i+);printf(“i=%d k=%dn”,i,k);c3)在c语言中,只有在使用时才占用内存单元的变量,其存储类型是(08 4) a)auto和register b)extern和registerc)auto和static d)static和registera4).有以下程序#include int f(int n);main() int a=3,s;s=f(a);s=s+f

33、(a); printf(“&dn”,s);int f(int n) static int a=1; n+=a+; return n;程序运行后的输出结果是(09.9 )a) 7 b) 8 c) 9 d)10c八、编译预处理 1.宏定义和调用(不带参数的宏,带参数的宏)。2.“文件包含”处理。c语言程序在运行之前要进行编译,而编译系统包括预处理、语言程序在运行之前要进行编译,而编译系统包括预处理、编译、连接等部分,但注意预处理命令是在执行编译之前处编译、连接等部分,但注意预处理命令是在执行编译之前处理的;理的;是是“#”开头的行开头的行;在源程序中这些命令都放在函数之在源程序中这些命令都

34、放在函数之外,而且一般都放在源程序之前外,而且一般都放在源程序之前;末尾不能有分号末尾不能有分号.宏 定 义- #define一、不带参数的宏定义一、不带参数的宏定义1.一般形式:一般形式:#define标志符标志符字符串字符串 例 #define pi 3.1415 #define s pi*r*r2.宏名宏名:3.宏展开宏展开:在预处理(预编译)时将宏名替:在预处理(预编译)时将宏名替换成字符串的过换成字符串的过程称为程称为“宏展开宏展开”。#define是宏是宏定义命令。定义命令。main()intr;floatf;scanf(“%d”,&r);f=s;printf(“%f”,f

35、);4.说明:说明:(1)宏名一般用)宏名一般用大写字母大写字母表示表示,以便与变量以便与变量名相区别。但名相区别。但也可以用小写。也可以用小写。f=pi*r*r - f = 3.1415*r*r (2)使用宏名代替一个字符串)使用宏名代替一个字符串,可以可以减少输入减少输入量量;提高程提高程序的通用性序的通用性。(3)宏定义是用宏名代替一个字符串)宏定义是用宏名代替一个字符串,只做只做简简单置换单置换,不分配不分配存储空间不做存储空间不做正确性检查,也不进行任正确性检查,也不进行任何计算(被替何计算(被替换的是字符串,不是表达式)。换的是字符串,不是表达式)。(4)宏定义)宏定义不是不是c语

36、句语句,不必在行末加分号(如不必在行末加分号(如果加了分号果加了分号则会连分号一起进行替换)则会连分号一起进行替换).#definepi3.1415;s=pi*r*r;-s=3.1415;*r*r;(5)#define命令出现在程序中函数的外面命令出现在程序中函数的外面,宏宏名的有效范名的有效范围为定义命令之后到本源文件结束。通常,围为定义命令之后到本源文件结束。通常,#define命命令写在文件开头,函数之前,作为文件令写在文件开头,函数之前,作为文件的的一部分,在一部分,在此文件范围内有效。此文件范围内有效。(6)可以用)可以用#undef命令结束宏定义的作用域。命令结束宏定义的作用域。#

37、definepi3.1415main()#undefpif1().(7)在进行宏定义时)在进行宏定义时,可以引用已定义的宏可以引用已定义的宏名,可以层层置换。名,可以层层置换。#definen3;#definemn*n-x;printf(“%d”,m);(8)对于程序中用双引号括起来的字符串)对于程序中用双引号括起来的字符串,即使与宏名相即使与宏名相同同,也不进行替换。也不进行替换。printf(“m”);n*n-x - 3*3-x二、带二、带参数参数的宏定义:的宏定义: 1.一般形式:一般形式:#define宏名宏名(形参表形参表)字字符串符串如:如:#defines(a,b)a*barea

38、=s(3,2);/*area的值为的值为3*2即即6*/#definepi3.1415926#defines(r)pi*r*rmain()floata,area;a=3.6;area=s(a);printf(“r=%fnarea=%fn”,a,area);pi*r*r- 3.1415926*r*r- 3.1415926*3.6*3.62、展开替换的方式:对带参数的宏的展开只、展开替换的方式:对带参数的宏的展开只是将语句中是将语句中的宏名后面括号内的实参代替的宏名后面括号内的实参代替#define命令命令行中的形参,而不是象调用函数时的值传行中的形参,而不是象调用函数时的值传递;递;如果宏定义中

39、的字符串中的字符不是如果宏定义中的字符串中的字符不是参数字符,则保留。参数字符,则保留。#defines(y)y*y-2*x#definel(y)(y)*(y)-2*xmain()floatk,x;scanf(“%f”,&x)k=s(3+5);k=l(3+5);3.说明:说明:在宏定义时,在宏名与带参数的括号之在宏定义时,在宏名与带参数的括号之间不应加间不应加空格,否则,将空格以后的字符都作为空格,否则,将空格以后的字符都作为替代字符替代字符串的一部分。串的一部分。#defines(y)y*y-2*xy*y-2*x-3+5*3+5-2*x (y)*(y)-2*x-(3+5)*(3+5)

40、-2*x 4、带参数的宏定义与函数的区别:、带参数的宏定义与函数的区别:(1)函数调用时,先求出实参表达式的值,)函数调用时,先求出实参表达式的值,然后传入形参;然后传入形参;而使用带参数的宏定义只而使用带参数的宏定义只是进行简单的字符替是进行简单的字符替换。换。#defines(y)y*yinth(intx)return(x*x);main()intz=2;printf(“%d,%d,%d,%d”,s(7),h(7),s(z+3),h(z+3)(2)函数调用是在程序运行时处理的,分配)函数调用是在程序运行时处理的,分配临时的内存单元。临时的内存单元。而宏展开则是在编译时而宏展开则是在编译时进

41、行的,在展开时并不分配内存单元,没进行的,在展开时并不分配内存单元,没有有“返回值返回值”的概念。的概念。z+3*z+3(3)对函数的实参、形参以及函数本身都要)对函数的实参、形参以及函数本身都要定义类型,二者类型要求一致。如不一致,定义类型,二者类型要求一致。如不一致,进行类型转换。进行类型转换。而宏不存在类型问题,宏名无类型,而宏不存在类型问题,宏名无类型,参数也无类型,只做为一个符号代表,展参数也无类型,只做为一个符号代表,展开时代入指定的字符即可。开时代入指定的字符即可。(4)使用宏次数多时,宏展开后实际上使源使用宏次数多时,宏展开后实际上使源程序变长,程序变长,而函数而函数调用不使调

42、用不使源程序变长,源程序变长,只是离开主调函数,只是离开主调函数,进入被调函数。进入被调函数。(5)宏替换不占运行时间,只占编译时间。宏替换不占运行时间,只占编译时间。而函数调用而函数调用则占则占运行时间。运行时间。(6)如果善于利用宏定义,可以实现程序)如果善于利用宏定义,可以实现程序的简化的简化1)有以下程序#include#define n 5#define m n+1#define f(x) (x*m) main() int i1,i2; i1=f(2); i2 = f(1+1); printf(“%d %dn”,i1,i2); 程序运行结果是(06 9) a)12 12 b)11 7

43、 c)11 11 d)12 7b2)有以下程序#include #define sub(a) (a)-(a)main() int a=2,b=3,c=5,d;d=sub(a+b)*c;printf(%dn,d);程序运行后的输出结果是(10.3)a)0b)-12c)-20 d)10c3)以下关于宏的叙述中正确的是(08 9) a)宏名必须用大写字母表示 b)宏定义必须位于源程序中所有语句之前 c)宏替换没有数据类型限制 d)宏调用比函数调用耗费时间c4)有一个名为init.txt的文件,内容如下: #define hdy(a,b) a/b #define print(y) printf(“y=%dn”,y) 有以下程序 #include “init.txt” main() int a=1,b=2,c=3,d=4,k; k=hdy(a+c,b+d); print(k); 下面针对该程序的叙述正确的是(07 4) a)编译出错 b)运行出错 c)运行结果为y=0 d)运行结果为y=6d文 件 包 含-#include文件包含文件包含:处理是指一个源文件可以将另外一个源处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将指定包含文件的全部内容包含进来,即将

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论