版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/141 C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/142C语言中,函数可分为两类语言中,函数可分为两类 :一类是由系统定义的标准函数,又称为库函数,其函数声明一般是放在系统的一类是由系统定义的标准函数,又称为库函数,其函数声明一般是放在系统的include目录下以目录下以.h为后缀的头文件中,如在程序中要用到某个库函数,必须在调用为后缀的头文件中,如在程序中要用到某个库函数,必须在调用该函数之前用该函数之前用#include命令将库函数信息包含到本程序中。命
2、令将库函数信息包含到本程序中。另一类函数是自定义函数另一类函数是自定义函数C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/143 1.1.1 函数定义函数定义 存储类型符存储类型符 返回值类型符返回值类型符 函数名函数名(形参说明表形参说明表) 函数语句体函数语句体 C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/144说明:说明: 1存储类型符存储类型符指的是函数的作用范围,它只有两种形式:指的是函数的作用范围,它只有两种形式:static和和extern。 static说明函数只能作用于其所在的源文件,用说
3、明函数只能作用于其所在的源文件,用static说明的函数又称为内部函数。说明的函数又称为内部函数。extern说明函数可被其它源文件中的函数调用,用说明函数可被其它源文件中的函数调用,用extern说明的函数,又称为外部说明的函数,又称为外部函数。函数。缺省情况为缺省情况为extern。 2返回值类型符返回值类型符指的是函数体语句执行完成后,函数返回的值的类型,如指的是函数体语句执行完成后,函数返回的值的类型,如int, float, char等等,若函数无返回值,则用空类型等等,若函数无返回值,则用空类型void来定义函数的返回值。来定义函数的返回值。缺省情况为缺省情况为int型。型。C C
4、 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1453函数名由任何合法的标识符构成。建议将函数名的命名与函数内容有一定关函数名由任何合法的标识符构成。建议将函数名的命名与函数内容有一定关系。系。4 形参说明表形参说明表是一系列用逗号分开的每个形参变量说明。是一系列用逗号分开的每个形参变量说明。如:如:int x, int y, int z这表示形参变量有三个:这表示形参变量有三个:x, y, z。它们的类型都是。它们的类型都是int型。型。 5函数语句体是放在一对花括号函数语句体是放在一对花括号 中,由局部数据类型描述和功能实现两部分中,由局部数据类型描述
5、和功能实现两部分组成。组成。 C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1466函数返回语句的形式有以下两种:函数返回语句的形式有以下两种:函数无返回值的情况:函数无返回值的情况:return;或者什么也不写;或者什么也不写函数有返回值的情况:函数有返回值的情况:return(表达式的值表达式的值);在第种情况下要注意在第种情况下要注意“表达式的值表达式的值”的类型必须与函数返回值的类型相一致。的类型必须与函数返回值的类型相一致。例如:求两个任意整数的绝对值的和,用函数例如:求两个任意整数的绝对值的和,用函数abs_sum()实现。实现。/*直接
6、调用库函数来计算直接调用库函数来计算m和和n的绝对值的绝对值 */int abs_sum(int m, int n) return (abs(m)+abs(n); /*函数函数abs()是在头文件是在头文件math.h中声明的中声明的*/ C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/147函数定义如下:函数定义如下:int abs_sum(int m, int n) if (m0) m=-m; if(n0) n=-n; return(m+n);1.1.2 函数声明和调用函数声明和调用 1函数的声明函数的声明函数声明的一般形式:函数声明的一般形式:存
7、储类型符存储类型符 返回值类型符返回值类型符 函数名函数名(形参说明表形参说明表);如:如:int abs_sun(int m, int n);C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1482函数调用函数调用函数调用是通过函数调用语句来实现的,分两种形式:函数调用是通过函数调用语句来实现的,分两种形式:无返回值的情况:无返回值的情况: 函数名函数名(实参表实参表);有返回值的情况:有返回值的情况: 变量名函数名变量名函数名(实参表实参表);该变量名的类型必须与函数的返回值类型相同。该变量名的类型必须与函数的返回值类型相同。函数调用时都会去执行函
8、数语句中的内容,函数执行完毕后,回到函数的调用处,函数调用时都会去执行函数语句中的内容,函数执行完毕后,回到函数的调用处,继续执行下面的语句。继续执行下面的语句。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1491.1.3 函数的传值方式函数的传值方式 函数的传值方式:函数的传值方式: 采用实参表将每一个实参的值相应地传递给每一个形参变量,形参变量在接收到实采用实参表将每一个实参的值相应地传递给每一个形参变量,形参变量在接收到实参表传过来的值时,会在内存参表传过来的值时,会在内存临时开辟新的空间临时开辟新的空间,以保留形参变量的值,当函数执行完,以
9、保留形参变量的值,当函数执行完毕时,这些毕时,这些临时开辟的内存空间会被释放临时开辟的内存空间会被释放,并且形参的值在函数中不论是否发生变化,并且形参的值在函数中不论是否发生变化,都不会影响到实参变量的值的变化都不会影响到实参变量的值的变化,这就是函数的传值方式。,这就是函数的传值方式。自定义函数在程序中的使用顺序有两种形式:自定义函数在程序中的使用顺序有两种形式: 先进行函数声明,再进行函数调用,先进行函数声明,再进行函数调用,函数定义放在函数调用之后。函数定义放在函数调用之后。函数声明在函数声明在函数调用之前。函数调用之前。 函数定义放在函数调用之前。函数定义放在函数调用之前。C C 程序
10、设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1410【例例1-1】 编程序,通过调用函数编程序,通过调用函数abs_sum(),求任意两个整数的绝对值的和。,求任意两个整数的绝对值的和。/*exam1_1.c 调用函数求两整数绝对值的和调用函数求两整数绝对值的和*/#include int abs_sum(int m,int n);main()int x,y,z;scanf(%d%d,&x,&y);z=abs_sum(x,y);printf(sum is %d,z);int abs_sum(int m,int n)if(m0)m=-m;if(n
11、0)n=-n;return m+n;C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1411用传值方式调用函数时,实参也可以是函数调用语句用传值方式调用函数时,实参也可以是函数调用语句 【例例1-2】求任意三个数的绝对值的和。求任意三个数的绝对值的和。/*exam1_2.c 调用函数求三个整数绝对值的和调用函数求三个整数绝对值的和*/#include int abs_sum(int m,int n);main()int x,y,z,sum;scanf(%d%d%d,&x,&y,&z);sum=abs_sum(abs_sum(x,
12、y),z);printf(sum is %d,sum);int abs_sum(int m,int n)if(m0)m=-m;if(n0)n=-n;return m+n;程序运行结果程序运行结果:7 12 5 sum is 24C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1412注意:注意: 对于有返回值的函数,调用时若没有把它赋给某个变量,仍然是可以的,只是函数对于有返回值的函数,调用时若没有把它赋给某个变量,仍然是可以的,只是函数的返回值有可能会被丢失。的返回值有可能会被丢失。【例例1-3】 求任意两数的乘积。求任意两数的乘积。自定义一个函数自
13、定义一个函数mul(),用于求两数的乘积,程序:,用于求两数的乘积,程序:/*exam1_3.c 求两个数的乘积求两个数的乘积*/#include float mul(float a,float b);main()float x,y,z;scanf(%f %f,&x,&y);z=mul(x,y); /* */x=x+10;y=y-10;mul(x,y); /* */C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1413x=x*2;y=y*2;printf(z=%f,mul(%f,%f)=%fn,z,x,y,mul(x,y); /* *
14、 /float mul(float a,float b)return a*b;程序运行结果程序运行结果:5 6 z=30.000000,mul(30.000000,-8.000000)=-240.000000C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1414程序说明:程序说明: 注释处调用函数后的返回值赋给变量注释处调用函数后的返回值赋给变量z。 注释处调用函数后的返回值没有赋给任何变量,函数的返回值被丢失。注释处调用函数后的返回值没有赋给任何变量,函数的返回值被丢失。 注释处调用函数后的返回值成为了注释处调用函数后的返回值成为了printf()
15、函数的参数。函数的参数。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1415 1变量的作用域变量的作用域 变量的作用域:指的是变量的有效范围,针对变量不同的作用域,可把变量分为局变量的作用域:指的是变量的有效范围,针对变量不同的作用域,可把变量分为局部变量和全局变量。部变量和全局变量。局部变量:在函数内部或某个控制块的内部定义的变量为局部变量,局部变量的有局部变量:在函数内部或某个控制块的内部定义的变量为局部变量,局部变量的有效范围只限于本函数内部,退出函数,该变量自动失效。效范围只限于本函数内部,退出函数,该变量自动失效。 全局变量:在函数外面定
16、义的变量称为全局变量,全局变量的作用域是从该变量定义的全局变量:在函数外面定义的变量称为全局变量,全局变量的作用域是从该变量定义的位置开始,直到源文件结束。在同一文件中的所有函数都可以引用全局变量。位置开始,直到源文件结束。在同一文件中的所有函数都可以引用全局变量。 C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1416局部变量和全局变量的作用域如图所示:局部变量和全局变量的作用域如图所示:C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1417【例例1-4】 变量作用域应用举例,阅读下面的程序,注意区分局部
17、变量和全变量作用域应用举例,阅读下面的程序,注意区分局部变量和全局变量的作用域。局变量的作用域。/*exam9_4.c 变量作用域举例变量作用域举例*/#include void a( void );void b( void );void c( void );int x = 1;main()int x = 5;printf(local x in outer scope of main is %dn, x );C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1418int x = 7;printf( local x in inner scope of m
18、ain is %dn, x );printf( local x in outer scope of main is %dn, x );a();b();c();a();b();c();前三次输出前三次输出结果结果:local x in outer scope of main is 5local x in inner scope of main is 7local x in outer scope of main is 5C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1419printf( local x in main is %dn, x );getc
19、har();return 0;void a( void )int x = 25;printf( nlocal x in a is %d after entering an, x );+x;printf( local x in a is %d before exiting an, x );C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1420void b( void ) static int x = 50; printf( nlocal static x is %d on entering bn, x ); +x; printf( local stat
20、ic x is %d on exiting bn, x );void c( void )printf( nglobal x is %d on entering cn, x );x *= 10;printf( global x is %d on exiting cn, x );C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1421程序运行结果程序运行结果: 后后6次函数调用次函数调用local x in a is 25 after entering alocal x in a is 26 before exiting a local static x
21、is 50 on entering blocal static x is 51 on exiting b global x is 1 on entering cglobal x is 10 on exiting c local x in a is 25 after entering alocal x in a is 26 before exiting a local static x is 51 on entering blocal static x is 52 on exiting bglobal x is 10 on entering cglobal x is 100 on exiting
22、 c最后一次输出:最后一次输出:local x in main is 5C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/14222变量的存储类型变量的存储类型 变量的存储类型:指的是变量的存储属性,它说明变量占用存储空间的区域。变量的存储类型:指的是变量的存储属性,它说明变量占用存储空间的区域。 在内存中,供用户使用的存储区由程序区、静态存储区和动态存储区三部分组成。在内存中,供用户使用的存储区由程序区、静态存储区和动态存储区三部分组成。 变量的存储类型有四种:变量的存储类型有四种:auto型、型、register型、型、static型和型和exter
23、n型。型。auto型变量存储在内存的动态存储区。型变量存储在内存的动态存储区。register型变量保存在寄存器中。型变量保存在寄存器中。static型变量和型变量和extern型变量存储在静态存储器。型变量存储在静态存储器。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1423局部变量的存储类型缺省值为局部变量的存储类型缺省值为auto型型 。全局变量的存储类型缺省值为全局变量的存储类型缺省值为extern型型 。auto型变量和型变量和register型变量只用于定义局部变量。型变量只用于定义局部变量。 static型变量即可定义成局部变量,又可
24、定义成全局变量。型变量即可定义成局部变量,又可定义成全局变量。 【例例1-5】 设计一个函数:设计一个函数:long fac(int n),可用来计算,可用来计算15的阶乘。的阶乘。分析:可在函数中定义一个分析:可在函数中定义一个static型变量,用来保存上次的计算结果。型变量,用来保存上次的计算结果。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1424/*exam1_5.c 用用static型变量保留上次阶乘的值型变量保留上次阶乘的值*/#include long fac(int n)static int f=1;f=f*n;return f;
25、main()int i;for(i=1;i=5;i+)printf(%d!=%ldn,i,fac(i);程序运行结果程序运行结果:1!=1 2!=2 3!=6 4!=24 5!=120C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1425 1内部函数内部函数 若函数的存储类型为若函数的存储类型为static型,则称其为内部函数或称静态函数,它表示在同一个程序中型,则称其为内部函数或称静态函数,它表示在同一个程序中(由多个源文件组成),该函数只能在一个文件中存在,在其它文件中不可使用。(由多个源文件组成),该函数只能在一个文件中存在,在其它文件中不可使
26、用。 如:如:static int fun-name();内部函数只能被其所在的源文件调用。内部函数只能被其所在的源文件调用。2外部函数外部函数 若函数的存储类型定义为若函数的存储类型定义为extern型,则称其为外部函数,它表示该函数能被其它源文型,则称其为外部函数,它表示该函数能被其它源文件调用。函数的缺省存储类型为件调用。函数的缺省存储类型为extern型。型。注意:在需要用到外部函数的文件中,其函数声明必须用注意:在需要用到外部函数的文件中,其函数声明必须用extern进行说明。进行说明。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1426
27、例如:有两个源文件和如下所示:例如:有两个源文件和如下所示:/* 调用外部函数调用外部函数*/# include int mod(int a, int b);extern int add (int m, int n); /*外部函数声明外部函数声明*main() int x, y, result; scanf (“%d%d”, &x, &y); result=add(x,y); /*调用外部函数调用外部函数*/ if (result 0) result=result-mod(x,y); printf(“result=%dn”, result);C C 程序设计基础教程程序设计基
28、础教程第九章第九章函数与宏定函数与宏定义义2022/2/1427int mod(int a, int b) return(a%d);/* 外部函数外部函数*/extern int add(int m, int n) return(m+n);说明:说明:1在文件在文件1()中的函数声明:中的函数声明: int mod(int a, int b);实际上相当于:实际上相当于:extern int mod(int a, int b);C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/14282在文件在文件2()中的函数定义:中的函数定义: extern int
29、 add(int m, int n) return(m+n); 实际上相当于:实际上相当于:int add(int m, int n) return(m+n); 3由多个源文件组成一个程序时,由多个源文件组成一个程序时,main()函数只能出现在一个源文件中。函数只能出现在一个源文件中。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/14294多个源文件的连接方式有三种:多个源文件的连接方式有三种:将各源文件分别编译成目标文件,得到多个目标文件(将各源文件分别编译成目标文件,得到多个目标文件(.obj后缀),然后用连接命后缀),然后用连接命令(令(tl
30、ink)把多个)把多个.obj文件连接起来,在文件连接起来,在Turbo c上用如下命令:上用如下命令: tlink +生成一个的可执行文件。生成一个的可执行文件。建立项目文件(建立项目文件(.prj后缀),具体操作可参阅各种后缀),具体操作可参阅各种C编译手册。编译手册。 使用文件包含命令。使用文件包含命令。 C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1430 C语言中一个函数中的语句可以是对另一个函数的调用。语言中一个函数中的语句可以是对另一个函数的调用。函数嵌套调用图例:函数嵌套调用图例:调用过程按图中箭头所示的方向和顺序进行,属于一种线性
31、调用关系,每次调用后,调用过程按图中箭头所示的方向和顺序进行,属于一种线性调用关系,每次调用后,最终返回到原调用点,继续执行以下语句。最终返回到原调用点,继续执行以下语句。 C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1431C语言中还允许在函数中调用自身,或函数之间相互调用,这种调用方式称语言中还允许在函数中调用自身,或函数之间相互调用,这种调用方式称之为递归。递归又分为直接递归调用和间接递归调用。之为递归。递归又分为直接递归调用和间接递归调用。 直接递归调用;函数直接调用自身。直接递归调用;函数直接调用自身。间接递归调用:函数互相调用对方。间接
32、递归调用:函数互相调用对方。直接递归:直接递归:int temp (int x) int y, z; z=temp(y); C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1432间接递归:间接递归:显然,递归有可能陷入无限递归状态,最终导致错误发生。因此,设计一个递归问题显然,递归有可能陷入无限递归状态,最终导致错误发生。因此,设计一个递归问题必须具备两个条件:必须具备两个条件:1后一部分与原始问题类似。后一部分与原始问题类似。2后一问题是原始问题的简化。后一问题是原始问题的简化。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏
33、定义义2022/2/1433【例例1-6】 编程,从键盘输入一个正整数编程,从键盘输入一个正整数n,求,求n!。n!的数字表达式为:的数字表达式为:n!=) 1()!1(*) 1, 0(1nnnn定义一个求定义一个求n!的函数:的函数:long fac(int n)long fac(int n) long result; if (n= = 0 | n= =1) result =1; else result=n*fac(n-1); return(result); C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1434完整程序如下:完整程序如下: /*e
34、xam1_6.c 用递归法求用递归法求n!*/#include long fac(int n)long result;if(n=0|n=1)result=1;elseresult=n*fac(n-1);return result;main()int x;long f;C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1435scanf(%d,&x);if(x1)设计一个函数:设计一个函数:long fibonacci (int n)用于计算数列中第用于计算数列中第n项的值,项的值, C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函
35、数与宏定义义2022/2/1437程序如下所示:程序如下所示: /*exam1_7.c 求第求第n项项Fibonacci数列的值数列的值*/#include long fibonacci(int n);main()int x=0;long result;doresult=fibonacci(x);printf(fibonacci(%d)=%ldn,x,result);scanf(%d,&x);while(x!=-1);C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1438long fibonacci(int n)if(n=0|n=1)retu
36、rn n;elsereturn fibonacci(n-1)+fibonacci(n-2);C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义2022/2/1439以以x=4为例,下图说明了为例,下图说明了fibonacci函数是怎样计算函数是怎样计算fibonacci(4)的。图中把的。图中把fibonacci简写成简写成f。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义40“编译预处理编译预处理”是是C与其它高级语言的一个重要区别。它们主要是:与其它高级语言的一个重要区别。它们主要是: 宏定义宏定义 文件包含文件包含 条件编译条件编译
37、 1.5 预处理预处理C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义411) 不带参数的宏定义不带参数的宏定义 用指定的标识符用指定的标识符(宏名宏名)代表一串字符。代表一串字符。#define 宏名宏名 字符串字符串1.5.1 宏定义宏定义例例 求正圆锥体的底周长、底面积和它的体积。求正圆锥体的底周长、底面积和它的体积。 #define PI 3.1415926 /* 宏名宏名PI用大写,行末无分号用大写,行末无分号 */ main( ) float l, s, r, v ; scanf(%f,&r); l = 2.0*PI*r; s = PI*r*r
38、; v = 4.0 / 3*PI*r*r*r ; printf(l=%10.4f ns=%10.4f nv=%10.4f n,l,s,v); getch(); C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义42 进行宏定义时,可以引用已定义的宏名,层层置换。进行宏定义时,可以引用已定义的宏名,层层置换。 对程序中用双引号括起来的字符串,即使与宏名相同,也不会被置换。对程序中用双引号括起来的字符串,即使与宏名相同,也不会被置换。 宏名的有效范围为该宏定义命令之后至本源文件结束。通常,宏定义命令一般写在文件开头或函宏名的有效范围为该宏定义命令之后至本源文件结束。通常,
39、宏定义命令一般写在文件开头或函数之前作为该文件的一部分。数之前作为该文件的一部分。 可以用可以用 #undef 命令终止宏定义的作用域。如:命令终止宏定义的作用域。如:#define G 9.8main( )#undef Gfloat f( ) G 的作用范围的作用范围C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义432带参数的宏定义带参数的宏定义语句形式:语句形式:#define 宏名宏名(形参表形参表) 字符串字符串注意:字符串应包含形参表中的参数注意:字符串应包含形参表中的参数例例#define PI 3.1415926#define S(r) PI*r*r
40、main( )float a, area; a=3.6; area=S(a); /*area=3.1415926*a*a,但不会置换,但不会置换a为为3.6 */ printf(r=%f narea=%f n,a,area); getch();C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义44 若将若将area=S(a) 改写成改写成 area=S(a+2),将置换为:,将置换为: area=PI a+2 a+2,而不是,而不是: area=PI (a+2) (a+2)。 若要达到后者,则应将宏定义命令改写为:若要达到后者,则应将宏定义命令改写为: #define
41、 S(r) PI (r) (r) 宏名与括号之间不得有空格,因为宏名与表达式之间的分隔符为空格。如果用宏名与括号之间不得有空格,因为宏名与表达式之间的分隔符为空格。如果用#define S (r) PI r r 的话,则被置换为的话,则被置换为 area=(r) PI r r (a)宏展开并不进行值的传递,即不求表达式的值,也没有宏展开并不进行值的传递,即不求表达式的值,也没有“返回值返回值”的概念。的概念。 宏不存在类型问题,宏名无类型,参数也无类型,表达式可以是任何类型。宏不存在类型问题,宏名无类型,参数也无类型,表达式可以是任何类型。C C 程序设计基础教程程序设计基础教程第九章第九章函
42、数与宏定函数与宏定义义45注注:这里的:这里的 t 展开后为展开后为 t = (a+b)(c+d)?(a+b):(c+d) 如果第一行写成:如果第一行写成: #define MAX(x,y) xy ? x : y 则这里的则这里的 t 展开后为展开后为 t = a+bc+d?a+b:c+d 因为因为置换展开是用置换展开是用“表达式表达式”对等的置换对等的置换“形参表形参表”中的参数中的参数。 定义带参数的宏,可以实现一些简单的函数功能。定义带参数的宏,可以实现一些简单的函数功能。如:如:#define MAX(x,y) (x)(y)?(x) : (y) main( )int a, b, c,
43、t ; t = MAX(a+b, c+d); C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义461.5.2 “文件包含文件包含” 用用 #include 命令实现一个文件包含另一个文件。命令实现一个文件包含另一个文件。 语句形式:语句形式: #include “文件名文件名”例例#include stdio.h#define N 2#define M N+1#define NUM (M+1)*M/2main( ) int i, n=0; for (i=1; i=NUM; i+) n+; printf(%2d, n); getch();输出结果:输出结果:1 2 3
44、 4 5 6 7 8C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义47 一个一个include命令只能指定一个被包含文件,如果要包含命令只能指定一个被包含文件,如果要包含n个文件,则要用个文件,则要用n个个include命令。命令。 NUM被代换展开后为:被代换展开后为:( 2+1+1) 2+1/2#include命令中,文件名既可用双引命令中,文件名既可用双引“ ”号号(推荐),也可用尖括号推荐),也可用尖括号括起来。括起来。表示被表示被包含在标准目录中包含在标准目录中(include).“”表示被包含文件在指定目录中,若只有文件名不带路径,则表示被包含文件在指
45、定目录中,若只有文件名不带路径,则在当前目录中,若找不到,再到标准目录中找。在当前目录中,若找不到,再到标准目录中找。包含文件名可以是包含文件名可以是.c源文件或源文件或.头文件,如头文件,如#include #include “myhead.h”#include “D:myexammyfile.c”C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定函数与宏定义义48 条件编译条件编译语句形式:语句形式:1#ifdef 宏名宏名程序段程序段1 #else程序段程序段2 #endif 作用:如果宏名已定义,则编译作用:如果宏名已定义,则编译“程序段程序段1”,否则编译,否则编译“程序段程序段2” 。所谓所谓“宏名已定义宏名已定义”是无论是无论“宏名宏名”定义为什么内容。定义为什么内容。 条件编译的作用:缩短编译时间,减少目标程序的长度。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三年级数学计算题专项练习汇编及答案
- 二年级语文上册教案第一单元
- 《电气控制系统设计与装调》教案 项目七任务二:自吸泵电动机控制线路的设计与安装
- 【初中物理】密度的利用同步训练+-2024-2025学年人教版物理八年级上册
- 家用电烹饪烤箱产品供应链分析
- 制搪瓷机械市场发展预测和趋势分析
- 块墨烟灰墨产业规划专项研究报告
- 垃圾处理焚化炉产业规划专项研究报告
- 工业用真空吸尘器市场发展预测和趋势分析
- 屠宰机产业深度调研及未来发展现状趋势
- 导尿术导尿术课件
- 生态停车场监理规划
- 我的应许之地:以色列的荣耀与悲情
- 二年级特色作业
- 农村寄宿制高中生心理健康现状及对策研究 论文
- 宾馆酒店标准化-安全管理人员任命书
- 药房药品养护记录表
- DBJ51-T 196-2022 四川省智慧工地建设技术标准
- 义务教育英语课程标准2022年英文版
- 可靠性的基本概念演示
- 中印边境争议地区
评论
0/150
提交评论