C语言 模块化程序设计_第1页
C语言 模块化程序设计_第2页
C语言 模块化程序设计_第3页
C语言 模块化程序设计_第4页
C语言 模块化程序设计_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

1、第第4章章 模块化程序设计模块化程序设计 北京交通大学计算机学院北京交通大学计算机学院赵宏赵宏1实用精品课件PPT教学目标教学目标 理解如何用函数模块构造程序理解如何用函数模块构造程序 熟悉标准库中常见的函数熟悉标准库中常见的函数 会定义和调用函数并理解函数调用的机制会定义和调用函数并理解函数调用的机制 掌握变量的作用域和存储类别掌握变量的作用域和存储类别 理解并运用递归函数编写程序。理解并运用递归函数编写程序。 2实用精品课件PPT4.1 模块化程序设计概述模块化程序设计概述 4.2 函数的声明、定义和调用函数的声明、定义和调用 4.3 函数的多级调用函数的多级调用 4.4 变量的作用域和存

2、储类别变量的作用域和存储类别 4.5 计算机随机模拟方法计算机随机模拟方法 4.6 编译预处理编译预处理 3实用精品课件PPT 复杂任务可以分解为若干子任务。复杂任务可以分解为若干子任务。 重复使用的程序段,将其进行独立设计,使计算机可以重重复使用的程序段,将其进行独立设计,使计算机可以重复执行。复执行。 4.1 模块化程序设计概述模块化程序设计概述main( )func1()func2()func3()func4()func5()func6()图图4-1 程序模块结构图程序模块结构图4实用精品课件PPT1. 引例引例 4.2 函数的声明、定义和调用函数的声明、定义和调用 /*程序名:程序名:

3、4_1.cpp*/*功能:计算两个实数中大的值功能:计算两个实数中大的值*/#include float fmax(float x , float y); /*函数说明函数说明*/void main() float a , b , c; scanf( “%f,%f”, &a , &b ); c = fmax(a , b); /*函数调用函数调用*/ printf( “max=%fn”, c ); float fmax(float x , float y) /*函数定义函数定义*/ float z; z = x y ? x : y; return z;5实用精品课件PPT2.函数说明函数说明 说

4、明格式为:说明格式为: 函数返回值类型函数返回值类型 函数名函数名( (参数表参数表) ); #include float fmax(float x , float y); /*函数说明函数说明*/void main() float a , b , c; scanf( “%f,%f”, &a , &b ); c = fmax(a , b); printf( “max=%fn”, c ); 函数说明是一条语句函数说明是一条语句,它指它指出函数返回值的类型、函出函数返回值的类型、函数的名称、函数要接收的数的名称、函数要接收的参数的个数、顺序和类型。参数的个数、顺序和类型。 如果在一个函数中要调用如

5、果在一个函数中要调用另外一个函数,则在调用另外一个函数,则在调用之前要对该函数进行说明。之前要对该函数进行说明。4.2 函数的声明、定义和调用函数的声明、定义和调用 6实用精品课件PPT3.函数定义函数定义 函数定义的一般形式:函数定义的一般形式: 函数值类型函数值类型 函数名函数名( (形参表形参表) /) /* *函数头函数头* */ / / /* *函数体函数体* */ / 说明部分说明部分 执行部分执行部分 4.2 函数的声明、定义和调用函数的声明、定义和调用 float fmax(float x , float y) float z; z = x y ? x : y; return

6、z;函数头函数头函数体函数体7实用精品课件PPT4.函数调用函数调用 函数调用的一般形式为函数调用的一般形式为: 函数名(实参表)函数名(实参表); ; 4.2 函数的声明、定义和调用函数的声明、定义和调用 void main() float a , b , c; scanf( “%f,%f”, &a , &b ); c = fmax(a , b); printf( “max=%fn”, c ); 可用两种方式调用函数:可用两种方式调用函数:(1) 函数的调用可以在允许表函数的调用可以在允许表达式出现的任何地方。如:达式出现的任何地方。如: c=fmax( a , b );(2) 函数调用可以

7、作为一条独函数调用可以作为一条独立的语句。比如,有函数定义:立的语句。比如,有函数定义:void printstar( ) printf(“*”);则可以把该函数调用作为一个则可以把该函数调用作为一个独立语句,独立语句, printstar();8实用精品课件PPT4.2 函数的声明、定义和调用函数的声明、定义和调用 函数返回值函数返回值 函数返回值的类型是由函函数返回值的类型是由函数定义或说明中的函数返数定义或说明中的函数返回类型决定的。如果返回回类型决定的。如果返回的类型与函数说明的不同,的类型与函数说明的不同,则在返回值时,先作隐含则在返回值时,先作隐含的类型转换,然后再返回。的类型转换

8、,然后再返回。 #include int fmax(float x , float y) return x y ? x : y;void main() float max; max = fmax(3.5 , 2.6); printf( “max=%fn” , max); 结果结果?9实用精品课件PPT4.2 函数的声明、定义和调用函数的声明、定义和调用 形参和实参形参和实参 形式参数:定义函数时放在函数名称之后括号中的参形式参数:定义函数时放在函数名称之后括号中的参数,简称形参。数,简称形参。实际参数:调用函数时括号中的参数,简称实参。实际参数:调用函数时括号中的参数,简称实参。形参与实参的结

9、合:函数在调用时,将生成实参值的形参与实参的结合:函数在调用时,将生成实参值的一个副本传递给对应的形参,这个过程称为形参与实一个副本传递给对应的形参,这个过程称为形参与实参的结合。如果只允许实参向形参传递数据,则被称参的结合。如果只允许实参向形参传递数据,则被称为为“单向传递单向传递”。 10实用精品课件PPT4.2 函数的声明、定义和调用函数的声明、定义和调用 参数传递实例参数传递实例 void swap(float x , float y) float t; t=x; x=y; y=t;void main() float a , b; scanf( “%f,%f”, &a , &b );

10、swap(a,b); printf( “%f,%fn”, a,b);3.53.52.62.6实参实参a实参实参b形参形参x形参形参y图图4-2 实参和形参数据的传递实参和形参数据的传递11实用精品课件PPT4.2 函数的声明、定义和调用函数的声明、定义和调用 函数的调用过程函数的调用过程 void main() float a , b , c; scanf( “%f,%f”, &a , &b ); c = fmax(a , b); printf( “max=%fn”, c);float fmax(float x , float y) float z; z = x y ? x : y; retu

11、rn z;保存返回地址及当前现场,保存返回地址及当前现场,为形参分配内存并将实参为形参分配内存并将实参的值传给形参变量的值传给形参变量恢复恢复main函数的函数的现场,取得返回现场,取得返回地址和返回值地址和返回值12实用精品课件PPT4.带自定义函数的程序设计带自定义函数的程序设计 4.2 函数的声明、定义和调用函数的声明、定义和调用 程序设计思路:程序设计思路:(1)定义一个函数定义一个函数isprime(int m)判断)判断m是否为是否为素数,若是素数,函数素数,若是素数,函数返回返回1,否则返回,否则返回0。int isprime(int m) int i; for(i=2;i=m-

12、1; i+) if (m % i = 0) return 0; return 1;(2)在主函数中输入一个整数,调用在主函数中输入一个整数,调用isprime函数,如果函数值为函数,如果函数值为1,则,则打印是素数,否则打印不是素数。打印是素数,否则打印不是素数。void main() int iNumber; printf (请输入一个整数:请输入一个整数:); scanf (%d , &iNumber); if (isprime (iNumber) ) printf (%d是素数是素数 , iNumber); else printf (%d不是素数不是素数 , iNumber);【例【例4

13、-2】从键盘输入一个整数,判断该整数是否为素数。】从键盘输入一个整数,判断该整数是否为素数。13实用精品课件PPT1.嵌套调用嵌套调用int min2(int a,int b) return ab?a:b; int min3(int a,int b,int c) int x,y; x=min2(a,b); y=min2(t,c); return y;#includevoid main() int t1,t2; t1=min2(-2,8); printf(“min=%dn”t1,); t2=min3(-2,8,-6); printf(“min=%dn”,t2);4.3 函数的多级调用函数的多级调

14、用14实用精品课件PPT4.3 函数的多级调用函数的多级调用main函数函数t1=min2(-2,8);t2=min3(-2,8,-6);min3函数函数x=min2(a,b);min2函数函数return a=0 & x = 9) printf(%dn , x); else printf(%d , x % 10); invertLongInt(x / 10);4.3 函数的多级调用函数的多级调用24实用精品课件PPT 小结:小结:函数分为系统函数和自定义函数。函数分为系统函数和自定义函数。每个函数的都是每个函数的都是独立定义独立定义的,如果函数定义在后、的,如果函数定义在后、调用在前,要对函

15、数原型进行说明。调用在前,要对函数原型进行说明。除了主函数外,其他函数可以相互调用,如果除了主函数外,其他函数可以相互调用,如果A调用调用B,B又调用又调用C,称为嵌套调用,如果直接或,称为嵌套调用,如果直接或间接调用自己,称为递归。间接调用自己,称为递归。25实用精品课件PPT 练习:练习:函数函数fun实现计算两个数之差的绝对值,并实现计算两个数之差的绝对值,并将差值返回调用函数,请编写将差值返回调用函数,请编写fun函数函数 fun(int x, int y)26实用精品课件PPT 第第7周作业:周作业:1在主函数中输入三角形的的三条边,调用子在主函数中输入三角形的的三条边,调用子函数,

16、判断是否能组成三角形,若可以则返回函数,判断是否能组成三角形,若可以则返回1否则返回否则返回0。在主函数中输出判断结果。在主函数中输出判断结果。2编写函数,求两个正整数编写函数,求两个正整数m和和n的最大公约数。的最大公约数。m 和和 n 作为函数的参数。函数返回运算结果,由作为函数的参数。函数返回运算结果,由主函数输出。主函数输出。4. 习题习题4.2 要求要求:第第8周上课前提交周上课前提交27实用精品课件PPT(1) 程序区程序区:存放用户程序代码,即程序中各个函数的代码。:存放用户程序代码,即程序中各个函数的代码。(2) 静态存储区静态存储区:存放程序的全局数据和静态数据。分配在静态:

17、存放程序的全局数据和静态数据。分配在静态存储区中的变量的生命期最长,它们在存储区中的变量的生命期最长,它们在main函数运行之前就函数运行之前就存在了,在程序的整个活动期(从程序开始执行到执行结束)存在了,在程序的整个活动期(从程序开始执行到执行结束)中,这些变量始终占用静态存储区中对应的存储空间,即程中,这些变量始终占用静态存储区中对应的存储空间,即程序开始执行时分配存储单元,程序执行完毕后释放。序开始执行时分配存储单元,程序执行完毕后释放。(3) 动态存储区动态存储区:存放局部变量。分配在动态存储区中的变量只:存放局部变量。分配在动态存储区中的变量只有在所定义的函数被调用时才分配存储单元,

18、函数结束时就有在所定义的函数被调用时才分配存储单元,函数结束时就释放。系统对函数调用时的现场保护、返回地址等也占用动释放。系统对函数调用时的现场保护、返回地址等也占用动态保护区。态保护区。(4)堆堆:自由存储区,用于运行程序时动态申请内存。自由存储区,用于运行程序时动态申请内存。4.4 变量的作用域和存储类别变量的作用域和存储类别1.程序在内存中的分布区域程序在内存中的分布区域 28实用精品课件PPT 局部变量:在块内定义的变量。局部变量:在块内定义的变量。 局部变量作用域:块内定义、块内使用。所谓块内是指一对局部变量作用域:块内定义、块内使用。所谓块内是指一对以以 为界限的若干个语句,例如函

19、数体、复合语句。而块内为界限的若干个语句,例如函数体、复合语句。而块内使用,是指变量的作用范围仅仅局限在从变量定义处开始、使用,是指变量的作用范围仅仅局限在从变量定义处开始、到变量定义所在的那个块结束。如:到变量定义所在的那个块结束。如:4.4 变量的作用域和存储类别变量的作用域和存储类别2.局部变量及存储类别局部变量及存储类别 局部于局部于main的局部变量的局部变量局部于局部于func的局部变量的局部变量void main() int n=5; printf(“%d”,n); func();void func() int n=8; printf(“%d”,n);29实用精品课件PPT 形式

20、参数也为局部变量,其作用范围是形式参数所形式参数也为局部变量,其作用范围是形式参数所在的整个函数。例如:在的整个函数。例如:void main() printf(“%d,%d”,x , y); /*error*/void func(int x , int y) /*/4.4 变量的作用域和存储类别变量的作用域和存储类别30实用精品课件PPT局部变量的存储类别局部变量的存储类别 : 自动变量自动变量:用关键字:用关键字auto(可缺省可缺省) 加以说明的局部变量。如:加以说明的局部变量。如:auto float b; 或或float b; 特点:是短生命期的局部变量,安排在动态存储区,由系统自特

21、点:是短生命期的局部变量,安排在动态存储区,由系统自动分配和释放,用到时分配内存,不用时释放内存,以节省程序动分配和释放,用到时分配内存,不用时释放内存,以节省程序执行时的内存资源。执行时的内存资源。 局部静态变量局部静态变量:用关键字:用关键字static 加以说明的局部变量。局部静态加以说明的局部变量。局部静态变量在静态存储区分配空间。如:变量在静态存储区分配空间。如: static int count; 特点:是长生命期的局部变量。函数执行结束后,分配给该变量特点:是长生命期的局部变量。函数执行结束后,分配给该变量的存储区不释放。局部静态变量安排在静态存储区。的存储区不释放。局部静态变量

22、安排在静态存储区。 寄存器变量寄存器变量:用关键字:用关键字register说明的局部变量为寄存器变量。说明的局部变量为寄存器变量。 特点:寄存器变量的值存放在特点:寄存器变量的值存放在CPU的寄存器中。可以提高程序的的寄存器中。可以提高程序的执行效率。执行效率。4.4 变量的作用域和存储类别变量的作用域和存储类别31实用精品课件PPT【例【例4-10】局部变量存储方式举例,分析下面程序运行结果:】局部变量存储方式举例,分析下面程序运行结果:/*程序名:程序名:4_10.cpp*/*功能:局部变量存储方式示例功能:局部变量存储方式示例*/#includeint fun1( int );int

23、fun2( int );void main() int i; for(i = 2 ; i 5 ; i+) printf (fun1(%d) = %d t , i , fun1( i ) ); printf(n); for(i = 2 ; i 5 ; i+) printf (fun2(%d) = %d t , i , fun2( i ) ); printf(n);4.4 变量的作用域和存储类别变量的作用域和存储类别32实用精品课件PPT续上页:续上页:int fun1( int x ) int f = 1; return ( f *= x );int fun2( int x ) static i

24、nt f = 1; return ( f *= x ); 4.4 变量的作用域和存储类别变量的作用域和存储类别程序执行结果为:程序执行结果为:fun1(2)=2 fun1(3)=3 fun1(4)=4fun2(2)=2 fun2(3)=6 fun2(4)=2433实用精品课件PPT#includeint func(int,int);void main()int k = 4, m = 1, p;p=func(k,m);printf(%d,p);p=func(k,m);printf(%dn,p);int func(int a,int b) static int m, i = 2;i += m+1;

25、m = i+a+b;return(m);结果:结果:8,17主函数:主函数:第一次第一次fun函数:函数:km41mi02mi83第二次第二次fun函数:函数:mi83mi171234实用精品课件PPT全局部变量:函数外定义的变量。全局部变量:函数外定义的变量。全局变量作用域:全局变量的作用范围是从变量定义处开始到所定义的源全局变量作用域:全局变量的作用范围是从变量定义处开始到所定义的源文件结束处,即从全局变量定义所在处开始到源文件结束处之间的所有函文件结束处,即从全局变量定义所在处开始到源文件结束处之间的所有函数都可以访问该变量数都可以访问该变量。如如:int n=1;void main()

26、 printf(“%d”,n); func(); printf(“%d”,n);float m;void func() n=5; m=3;4.4 变量的作用域和存储类别变量的作用域和存储类别2.全局部变量及存储类别全局部变量及存储类别 35实用精品课件PPT【例【例4-11】全局变量的作用域举例,分析下面程序运行结果。】全局变量的作用域举例,分析下面程序运行结果。#includevoid swap(void); int a , b; /*是两个函数公用的变量是两个函数公用的变量*/void main() scanf(%d%d,&a,&b); printf(交换前的交换前的 a和和 b是是%d,

27、%dn , a , b); swap(); printf(交换后的交换后的 a和和 b是是%d,%dn , a , b);void swap() int t; t = a; a = b; b = t; /*使用的变量名使用的变量名 a和和 b 全局变量全局变量 a和和 b*/4.4 变量的作用域和存储类别变量的作用域和存储类别36实用精品课件PPT 局部变量与全局变量同名时的处理:小范围优先局部变量与全局变量同名时的处理:小范围优先【例【例4-12】分析下面程序运行结果:】分析下面程序运行结果: int i = 1; /*变量变量i定义在所有函数之外,属于全局变量定义在所有函数之外,属于全局变

28、量*/ void main() printf(“主函数中访问的变量主函数中访问的变量 i:%dn , i); i = test ( ) + 1; printf(“主函数中访问的变量主函数中访问的变量 i:%dn , i); int test ( ) int i; printf(“ test 中访问的变量中访问的变量 i:%dn , i); i = 2; printf(“ test 中访问的变量中访问的变量 i:%dn , i); return i; 4.4 变量的作用域和存储类别变量的作用域和存储类别程序运行结果:程序运行结果:主函数中访问的变量主函数中访问的变量 i:1test 中访问的变量

29、中访问的变量 i:28345test 中访问的变量中访问的变量 i:2主函数中访问的变量主函数中访问的变量 i:337实用精品课件PPT全局部变量的存储类别全局部变量的存储类别 : 静态全局变量静态全局变量:使用关键字:使用关键字 static定义定义 的全局变量是文件内部的的全局变量是文件内部的全局变量。全局变量。 特点:只能被定义所在的源文件中的所有函数访问,同一程序的特点:只能被定义所在的源文件中的所有函数访问,同一程序的其它其它 源文件中的函数都不能访问该变量。源文件中的函数都不能访问该变量。 非静态全局变量非静态全局变量:使用缺省关键字的全局变量。:使用缺省关键字的全局变量。 特点:

30、则该变量不仅能被定义所在的源文件中的所有函数访问,特点:则该变量不仅能被定义所在的源文件中的所有函数访问,而且组成程序的其它源文件中的所有函数也都能访问该变量。因而且组成程序的其它源文件中的所有函数也都能访问该变量。因此,从作用范围看,缺省关键字的全局变量要比使用关键字此,从作用范围看,缺省关键字的全局变量要比使用关键字 static 的静态全局变量大。的静态全局变量大。 关键字关键字 extern 的作用的作用 关键字关键字 extern 的作用是对要使用的某个尚未定义的全局变量在的作用是对要使用的某个尚未定义的全局变量在使用前作变量说明,该全局变量或者是以后会在该源文件中定义使用前作变量说

31、明,该全局变量或者是以后会在该源文件中定义的全局变量,或者是在另一个源文件中使用缺省关键字定义的全的全局变量,或者是在另一个源文件中使用缺省关键字定义的全局变量。局变量。4.4 变量的作用域和存储类别变量的作用域和存储类别38实用精品课件PPT【例【例4-13】全局变量存储方式举例,分析下面程序运行结果:】全局变量存储方式举例,分析下面程序运行结果:/*程序名:程序名:4_13.cpp*/*功能:全局变量存储方式示例功能:全局变量存储方式示例*/#includeextern int a; /*对对4_13_2.cpp中定义的变量进行说明中定义的变量进行说明*/void fun1();void

32、fun2();void main() fun1(); fun2(); printf(函数函数 main 中的中的 a是是 %dn,a);4.4 变量的作用域和存储类别变量的作用域和存储类别39实用精品课件PPT/*程序名:程序名:4_13_1.cpp*/#includestatic int a; /*只允许文件只允许文件4_13_1.cpp中函数访问的全局变量中函数访问的全局变量*/void fun1() a = 2; printf(函数函数 fun1 中的中的 a是是 %dn,a);/*程序名:程序名:4_13_2.cpp */#includeint a; /*允许其它文件中函数访问的全局变

33、量允许其它文件中函数访问的全局变量*/void fun2() a = 4; printf(函数函数 fun2 中的中的 a是是 %dn,a);4.4 变量的作用域和存储类别变量的作用域和存储类别40实用精品课件PPT rand()函数可随机生成函数可随机生成0RAND_MAX之间的一个整数。之间的一个整数。RAND_MAX是头文件是头文件中定义的一个符号常量。中定义的一个符号常量。ANSI规定规定RAND_MAX的值不小于的值不小于32767。 根据下面公式可以得到所需范围内的随机数:根据下面公式可以得到所需范围内的随机数: n = a + rand () % b 其中其中a为位移,是所需连续

34、整数范围的第一个数,为位移,是所需连续整数范围的第一个数,b是比例因是比例因子,是所需连续整数范围的宽度,则希望产生子,是所需连续整数范围的宽度,则希望产生16之间随机数之间随机数的公式为:的公式为: face = 1 + rand () % 64.5 计算机随机模拟方法计算机随机模拟方法1.伪随机数的产生伪随机数的产生 41实用精品课件PPT【例【例4-14】编写一个模拟投掷硬币的程序,模拟】编写一个模拟投掷硬币的程序,模拟20次,统计出次,统计出正面出现的次数。正面出现的次数。#include#includevoid main()int i , face , iCount = 0;for(

35、i = 1 ; i = 20 ; i+)face = rand () % 2;printf(%5d , face);if ( i % 10 = 0 ) printf(n);if ( face ) iCount+;printf(正面出现次数:正面出现次数:%d次次n , iCount);4.5 计算机随机模拟方法计算机随机模拟方法42实用精品课件PPT运行程序,结果为:运行程序,结果为:1 1 0 0 1 0 0 0 0 01 1 1 1 1 1 1 0 1 0正面出现次数:正面出现次数:11次次再次运行该程序结果为:再次运行该程序结果为:1 1 0 0 1 0 0 0 0 01 1 1 1 1

36、 1 1 0 1 04.5 计算机随机模拟方法计算机随机模拟方法43实用精品课件PPT 用用srand()函数进行随机化函数进行随机化void main()unsigned seed;printf(“输入一个非负整数做种子:输入一个非负整数做种子:”);scanf(“%d” , &seed);srand (seed);for(int i = 1 ; i = 10 ; i+)printf(%3d , 1 + rand () % 6 );运行运行3次程序:次程序:输入一个非负整数做种子:输入一个非负整数做种子:161 3 4 3 5 6 5 2 6 2输入一个非负整数做种子:输入一个非负整数做种子

37、:333 1 5 3 5 6 5 4 1 5输入一个非负整数做种子:输入一个非负整数做种子:161 3 4 3 5 6 5 2 6 24.5 计算机随机模拟方法计算机随机模拟方法44实用精品课件PPT 使用系统定时使用系统定时/计数器的值做为随机种子:计数器的值做为随机种子: srand(time(NULL); time()函数返回以秒为单位的当前时间值,因为有时钟参数,函数返回以秒为单位的当前时间值,因为有时钟参数,而时间始终在变,随机数序列就不会固定不变了。而时间始终在变,随机数序列就不会固定不变了。【例【例4-16】编写程序,用来生成一个随机小写字符串。】编写程序,用来生成一个随机小写字

38、符串。 #include #include #include void main() srand (time (NULL) );for(int i = 1 ; i 1 & sqrt( x 1 ) * (x - 1) + y * y) g = g + 1;g为落入为落入s区雨点的数目。程序参见教材区雨点的数目。程序参见教材4_17.cpp。4.5 计算机随机模拟方法计算机随机模拟方法122 yx1) 1(22yx47实用精品课件PPT “文件包含文件包含”是指一个源文件可以将另一个源文件的是指一个源文件可以将另一个源文件的全部内容包含进来。在编译预处理时全部内容包含进来。在编译预处理时#incl

39、ude指令指令让预处理器在程序该点处加入指定文件内容,然后作让预处理器在程序该点处加入指定文件内容,然后作为一个源文件编译形成新文件。为一个源文件编译形成新文件。文件包含的一般形式为:文件包含的一般形式为:(1) #include (2) #include文件名文件名例如:例如:#include #include stdio.h4.6 编译预处理编译预处理1.文件包含文件包含#include48实用精品课件PPT(1) 定义符号常量定义符号常量#define 标识符标识符 字符串字符串如:如:#define PI 3.14预处理器将在源文件中搜索预处理器将在源文件中搜索PI,并把每个,并把每个

40、PI替换成替换成3.14。完成搜索和操作替换后,预处理器删除完成搜索和操作替换后,预处理器删除#define行。行。(2) 定义宏定义宏 #define 宏名宏名(参数表参数表) 字符串字符串如:如: #define S(a , b) a * b对程序中带有实参的宏对程序中带有实参的宏(如如S(3 , 4),按,按#define命令中指定命令中指定的字符串从左到右进行替换。如果字符串中包含宏的形参的字符串从左到右进行替换。如果字符串中包含宏的形参(如如a , b),则将程序语句中相应的实参代替形参,如果宏,则将程序语句中相应的实参代替形参,如果宏定义中字符串中的字符不是参数字符定义中字符串中的

41、字符不是参数字符(如如a*b中的中的*)则原样则原样保留。保留。4.6 编译预处理编译预处理2.宏定义宏定义#define 49实用精品课件PPT(3) 宏与函数宏与函数 宏替换只占编译时间,不占运行时间。但函数调用时分配单元、宏替换只占编译时间,不占运行时间。但函数调用时分配单元、传值、返回值时都占时间,特别是多次调用时尤为严重。但使传值、返回值时都占时间,特别是多次调用时尤为严重。但使用宏的程序代码较长,因为宏在程序中存在了多次,而使用函用宏的程序代码较长,因为宏在程序中存在了多次,而使用函数时,虽然多次调用,但函数代码只存在一次。数时,虽然多次调用,但函数代码只存在一次。 函数调用时先求

42、实参表达式的值,再传给形参。而带参数的宏函数调用时先求实参表达式的值,再传给形参。而带参数的宏只是简单的字符替换,宏展开时并不对实参表达式求值。函数只是简单的字符替换,宏展开时并不对实参表达式求值。函数调用时临时分配存储单元,宏替换并不分配存储单元,也没有调用时临时分配存储单元,宏替换并不分配存储单元,也没有返回值。返回值。 宏是无类型的。宏既可以用于浮点型,也可以用于整型,因为宏是无类型的。宏既可以用于浮点型,也可以用于整型,因为预处理器只是完成字符替换,而不考虑它的参数类型。如果使预处理器只是完成字符替换,而不考虑它的参数类型。如果使用函数,则对于每种求平方的数据类型都需要一个函数。用函数

43、,则对于每种求平方的数据类型都需要一个函数。4.6 编译预处理编译预处理50实用精品课件PPT 条件编译就是按条件对条件编译就是按条件对C/C+程序的一部分进行编译,其它程序的一部分进行编译,其它部分不编译。部分不编译。(1)使源代码能更迅速、更容易地进行修改,并使目标代码缩短。使源代码能更迅速、更容易地进行修改,并使目标代码缩短。如:如:# if (MAX 99) printf(Compiled for array greater than 99n);# else printf(Compiled for small arrayn);# endif(2)协调多个头文件,避免一个符号或一个头文件

44、被多次包含。协调多个头文件,避免一个符号或一个头文件被多次包含。例如,符号例如,符号NULL在几个不同的头文件中都进行了定义,如果在几个不同的头文件中都进行了定义,如果一个源文件包含其中几个头文件,则会出现符号一个源文件包含其中几个头文件,则会出现符号NULL被多次被多次定义的错误,这时需要使用条件编译命令:定义的错误,这时需要使用条件编译命令:# ifdef NULL# define NULL(void)0)#endif4.6 编译预处理编译预处理3.条件编译条件编译51实用精品课件PPT4.7 本章小结本章小结 函数分为系统函数和自定义函数。函数分为系统函数和自定义函数。 每个函数的都是独立定义的,如果函数定义在后、调用在每个函数的都是独立定义的,如果

温馨提示

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

评论

0/150

提交评论