函数与预处理.ppt

上传人:石*** 文档编号:38196997 上传时间:2022-09-02 格式:PPT 页数:66 大小:4.20MB
返回 下载 相关 举报
函数与预处理.ppt_第1页
第1页 / 共66页
函数与预处理.ppt_第2页
第2页 / 共66页
点击查看更多>>
资源描述

《函数与预处理.ppt》由会员分享,可在线阅读,更多相关《函数与预处理.ppt(66页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、现在学习的是第1页,共66页#include void main()static int a20=8,12,19,23,33,39,42,55,62,69,76,85;int n=12,i,x;coutThe numbers are :n;for (i=0;in;i+)coutait;cout*n;coutx;for (i=n-1;i=0;i-)if (aix) ai+1=ai;else break;ai+1=x;n+;coutThe numbers are :n;for (i=0;in;i+)coutait;cout*n;现在学习的是第2页,共66页#include void main()s

2、tatic int a20=8,12,19,23, 33,39,42,55,62,69,76,85;int n=12,i,x;arrayprint(a,n);coutx;for (i=n-1;i=0;i-)if (aix) ai+1=ai;else break;ai+1=x;n+;arrayprint(a,n);void arrayprint(int a,int n) coutThe numbers are :n; for (i=0;in;i+)coutait; coutab;s=add(a,b);coutsendl;现在学习的是第4页,共66页double area(double x,dou

3、ble y,double z)double s;if (x+yz|x+zy|y+zab;s=add(a,b);coutsendl;double area(double x,y,z)double s;if (x+yz|x+zy|y+zx) return 0;s=(x+y+z)/2;s= sqrt(s*(s-x)*(s-y)*(s-z);return s;现在学习的是第5页,共66页例1 无参函数display_sum,用来计算两个数之和。#include void display_sum( )int x,y,sum;cout Enter a and b: x y;sum = x+y;cout x

4、+y= sum endl;void main( )display_sum( );由花括号所括起的语句序列,是完成函数功能所要执行的具体操作。当函数执行结束需要返回一个值时,在这个函数体中还必须有一个return语句。 例2 有参函数sum,用于求两个数之和。int sum(int x , int y) int temp;temp = x+y;return temp;void main( )int s = sum(10,5 );cout”sum=”s;现在学习的是第6页,共66页double power(int n)int i;double l=1;for (i=1;i=n;i+) l*=i;r

5、eturn l;double area(double x,double y,double z)double s;if (x+yz|x+zy|y+zx) return 0;s=(x+y+z)/2;s= sqrt(s*(s-x)*(s-y)*(s-z);return s;现在学习的是第7页,共66页_语句格式:语句格式:return ;/无值无值voidreturn 表达式;表达式;/有值有值return (表达式表达式);/有值有值_函数体中的流程控制语句。先计函数体中的流程控制语句。先计算表达式的值,然后从算表达式的值,然后从被调函数被调函数返回到返回到主调函数主调函数,表达式的值作,表达式的

6、值作为函数的返回值。为函数的返回值。( 注意:只能注意:只能返回一个值返回一个值)_函数值的类型:以函数定义的类函数值的类型:以函数定义的类型为准,若不同,需将型为准,若不同,需将return语语句表达式的值转换类型。句表达式的值转换类型。_无返回值无返回值void时,可无时,可无return语语句,执行到函数体句,执行到函数体时返回。时返回。例 有参函数sum,用于求两个数之和。int sum(int x , int y) int temp;temp = x+y;return temp;void main( )int s = sum(10,5 );cout”sum=”s;现在学习的是第8页,

7、共66页_在一个函数中可有多个在一个函数中可有多个return语句,但每次被语句,但每次被调用只能执行一个调用只能执行一个return语句。例,判断素数语句。例,判断素数(或求三角形面积)(或求三角形面积)#includevoid main()int i;for (i=2;i100;i+) if (sushu(i) coutti;#includeint sushu(int n)int k,i;k=sqrt(double)n);for (i=2;i=k;i+)if (n%i=0) return 0;return 1;现在学习的是第9页,共66页_函数原型的形式:数据类型 被调函数的函数名(形参类

8、型说明);例:double area(double,double,double);_参数类型说明列表是用逗号隔开的的参数类型说明,其参数个数和类型必须和函数定义中的参数个数和类型一致。也可以给出参数名,但对编译器没有什么意义。 _函数原型用来说明一个函数的返回值类型、参数的个数和类型。使编译器检查该函数被调用的正确与否。 函数必须先说明后调用。_调用库函数时,一般在文件的开头用#include 命令将包含该函数原型的头文件加入到程序中。_调用用户自定义函数,当对一个函数的调用出现在该函数定义之前时,必须先对函数进行原型声明。即当被调函数的定义写在主调函数后面时才需声明。现在学习的是第10页,共

9、66页_实参表可包含多个参数,用逗号分开;可为常量、实参表可包含多个参数,用逗号分开;可为常量、变量、函数调用、表达式(先求值,再将值传递给变量、函数调用、表达式(先求值,再将值传递给形参)。形参)。_要求实参的类型和个数要与形参一致。要求实参的类型和个数要与形参一致。_可以没有参数,但圆括号一定要有,不能省略。可以没有参数,但圆括号一定要有,不能省略。_函数调用一般用来构成表达式。函数调用一般用来构成表达式。5.2.1 函数的调用形式一、函数调用形式:t=sqrt(t*(t-a)*(t-b)*(t-c);s=area(a,b,c);s=sum(5,7 );现在学习的是第11页,共66页主调函

10、数被调函数float area(x,y,z)return smain( )s=area(a,b,c);实 参形 参 现在学习的是第12页,共66页_在函数调用时,按照书写参数的先后次序在函数调用时,按照书写参数的先后次序(与名字无关与名字无关),将实参的值将实参的值(先计算先计算)传递给对应的形参。传递给对应的形参。_要求实参和形参的类型和个数要一致。要求实参和形参的类型和个数要一致。_实参将值实参将值“单向性单向性”的的“值传递值传递”给形参。在被调函数中给形参。在被调函数中对形参的值的修改不会影响到实参。对形参的值的修改不会影响到实参。_当函数未被调用时,形参不占内存。当函数被调用时,当函

11、数未被调用时,形参不占内存。当函数被调用时,为形参分配内存,并将实参的值传递给形参;函数调用为形参分配内存,并将实参的值传递给形参;函数调用结束时,释放形参所占存储空间。结束时,释放形参所占存储空间。传值调用:先计算实参的值,将实参的值传递给形参。编写函数,交换两个变量的值练习:编写convert函数实现将任意一个正整数逆序,若主函数中输入123,调用该函数处理,并将结果321在主函数中输出。现在学习的是第13页,共66页_地址传递:地址传递:_引用调用:通过在函数中使用引用参数实现地址传递。引用调用:通过在函数中使用引用参数实现地址传递。_把形参声明为引用方式,在参数名字前加上引用运算符把形

12、参声明为引用方式,在参数名字前加上引用运算符&。引用时给已知变量起一个别名,并不占用存储空间。引用时给已知变量起一个别名,并不占用存储空间。#include void swap(int &x,int &y);void main()int a,b;cinab;swap(a,b);coutabendl;void swap(int &x,int &y)int t=x;x=y;y=t;(1)在函数内对形参的修改实际是针对实参的修改。(2)在传递大型的数据时,不再有高额的内存单元与时间的开销。(3)容易使用,易于维护现在学习的是第14页,共66页#includeint fun(int *);void m

13、ain()int a=8,b;b=fun1(&a);couta=“a“b=“b;int fun1(int *p)int x=4;*p+=x;coutx*p“n”;return *p*x;8abpa=12b=484x48124 12现在学习的是第15页,共66页#includeint fun(int *);void main()int a=8,b;b=fun1(&a);couta=“a“b=“b;int fun1(int *p)int x=4;*p+=x;coutx*p“n”;return *p * x;#includeint fun(int);void main()int a=8,b;b=fu

14、n1(a);couta=“a“b=“b;int fun1(int p)int x=4;p+=x;coutxp“n”;return p*x;a=12b=484 12a=8b=484 12现在学习的是第16页,共66页swap(int *x,int *y)int t;t=*x;*x=*y;*y=t;#includevoid main()int a,b;a=5;b=9;swap( &a, &b );cout“a=“a“b=“b;swap (int x,int y) int t; t=x; x=y; y=t;#includevoid main ()int a,b;a=5;b=9;swap(a,b);c

15、out“a=“a“b=“b;程序 1程序 2 主调函数被调函数实 参形 参现在学习的是第17页,共66页主调函数被调函数includeint swap(int,int);void main ()int a,b;a=5;b=9;swap(a,b);cout“a=“a“b=“b;swap (int x,int y) int t; t=x; x=y; y=t;55ab实 参形 参99xyab程序 1xy95现在学习的是第18页,共66页主调函数被调函数&a实 参形 参&b*x*yabswap(int *x,int *y) int t; t=*x;*x=*y;*y=t; #includeint swa

16、p(int*,int *);void main()int a,b;a=5;b=9;swap( &a, &b );cout“a=”a“b=“b;5ab9程序 2xy&b&a95现在学习的是第19页,共66页_指针作为函数的参数时,是以变量的地址作为实参调用一个指针作为函数的参数时,是以变量的地址作为实参调用一个函数,即作为参数传递的不是数据本身,而是数据的地址。函数,即作为参数传递的不是数据本身,而是数据的地址。_在主调函数中,要以变量的存储地址作为实参来调用另一在主调函数中,要以变量的存储地址作为实参来调用另一个函数。个函数。_被调用函数的形参必须是可以接受地址值的指针变量,被调用函数的形参必

17、须是可以接受地址值的指针变量,而它的数据类型应与被传送的数据类型保持一致。而它的数据类型应与被传送的数据类型保持一致。 现在学习的是第20页,共66页_用数组名作实参,就是将用数组名作实参,就是将数组的首地址数组的首地址传递给形参,实传递给形参,实参数组与形参数组占用同一段内存。参数组与形参数组占用同一段内存。_则在被调函数中对形参数组元素的进行赋值,就是对主则在被调函数中对形参数组元素的进行赋值,就是对主调函数的实参数组进行操作,会在函数返回时将对数组的调函数的实参数组进行操作,会在函数返回时将对数组的修改结果带回主调函数。修改结果带回主调函数。_形参为一维数组名时,元素个数可省。形参为一维

18、数组名时,元素个数可省。_一般将所处理数组中元素个数也作为形参,在调用时将数组一般将所处理数组中元素个数也作为形参,在调用时将数组中使用的元素个数传递给被调函数。中使用的元素个数传递给被调函数。_数组名作实参时,形参也可为指针。数组名作实参时,形参也可为指针。5.3.2 函数调用中数组的传递(数组名做函数参数)现在学习的是第21页,共66页#includevoid sort(int ),output(int );void main()int a10,i;/*INPUT*/coutnInput data: ;for(i=0;iai;output(a);sort(a);output(a);void

19、 sort(int x)int i,j,t; for (i=0;i9;i+) for (j=0;jxj+1) t=xj; xj=xj+1; xj+1=t;void output(int x) int i; coutThe datum are:n; for (i=0;i10;i+) coutxi“t”; coutn;数组名作参数例1-1a0ax0 x现在学习的是第22页,共66页#include#define SIZE 40void sort(int *),output(int *); void main() int aSIZE,i,n;coutn; for (i=0;iai; output(a

20、,n); sort(a,n); output(a,n);void sort(int x,int n) int i,j,t; for (i=0;in-1;i+) for (j=0;jxj+1) t=xj; xj=xj+1; xj+1=t;void output(int x,int n) int i; coutThe datum are:n; for (i=0;in;i+)coutxi“t”; coutn;数组名作参数例1-2现在学习的是第23页,共66页void sort(int *px,int n) int i,j,t; for (i=0;in-1;i+) for (j=0;jpxj+1) t

21、=pxj; pxj=pxj+1; pxj+1=t;void output(int *px,int n) int i; coutThe datum are:n; for (i=0;in;i+) coutpxi“t”; coutn;数组名作参数例1-3#include#define SIZE 40void main()void sort(),output(); int aSIZE,i,n;coutn;for(i=0;iai;output(a,n);sort(a,n);output(a,n);现在学习的是第24页,共66页_如果程序是对数组进行处理,应采用地址传递,因为实参与如果程序是对数组进行处理

22、,应采用地址传递,因为实参与形参共用同一存储空间。形参共用同一存储空间。_如果程序希望从函数中返回多个值,形参应声明为指针或引如果程序希望从函数中返回多个值,形参应声明为指针或引用。用。_如果如果 程序希望形成的改变能影响到相应的形参,形参应声程序希望形成的改变能影响到相应的形参,形参应声明为指针变量或引用。明为指针变量或引用。_除以上情况外,应采用变量的值传递方式,可以减少函数间除以上情况外,应采用变量的值传递方式,可以减少函数间的关联。的关联。现在学习的是第25页,共66页_一个函数在编译时被分配一个入口地址(第一条指令的地一个函数在编译时被分配一个入口地址(第一条指令的地址),可以将该地

23、址赋给一个指针变量,该指针中存储的就址),可以将该地址赋给一个指针变量,该指针中存储的就是该函数的入口地址,这样的指针为函数指针。是该函数的入口地址,这样的指针为函数指针。_函数指针定义的一般形式为:函数指针定义的一般形式为:数据类型数据类型 (*指针变量名)指针变量名) (形参列表)形参列表)_ 在说明函数指针时,要同时描述这个指针所指向的形参类在说明函数指针时,要同时描述这个指针所指向的形参类型和个数,及函数的返回值类型,例如:型和个数,及函数的返回值类型,例如:Int (*funp) (int a,int b)_函数指针的意义:在进行指针运算时的结果是使程序控制转函数指针的意义:在进行指

24、针运算时的结果是使程序控制转移至该函数指针所指向的函数的入口地址,从而开始执行该移至该函数指针所指向的函数的入口地址,从而开始执行该函数。函数。现在学习的是第26页,共66页#include int func(int a,int b);void main()int (*pf)(int a,int b);pf=func;coutinput two number:mn;int result=(*pf)(m,n);coutresult=resultendl;int func(int a,int b)return a+b;定义指向调用现在学习的是第27页,共66页#include int max(in

25、t x,int y);int min(int x,int y);int add(int x,int y);void process(int x,int y,int(*fun)(int,int);void main()int a,b;coutab;coutmax=;process(a,b,max);coutmin=;process(a,b,min);couty?x:y);int min(int x,int y)return(xy?x:y);int add(int x,int y)return x+y;void process(int x,int y,int(*fun)(int ,int)int

26、result;result=(*fun)(x,y);coutresultendl;现在学习的是第28页,共66页_函数指针时一个指向函数的指针变量,专门用来存放函数的函数指针时一个指向函数的指针变量,专门用来存放函数的入口地址,因此在一段程序中,一个指针函数可被多次赋值,入口地址,因此在一段程序中,一个指针函数可被多次赋值,指向不同的函数。指向不同的函数。_函数指针只能指向函数的入口地址,不能指向函数中某一条函数指针只能指向函数的入口地址,不能指向函数中某一条指令,对函数指针进行如下操作是无意义的:指令,对函数指针进行如下操作是无意义的:p+,p+a;现在学习的是第29页,共66页main()

27、调用a函数.a 函数调用b函数b函数在被调函数中,又调用了函数-嵌套调用现在学习的是第30页,共66页#includedouble area(double, double ,double);void main()double a,b,c,s;coutabc;s=area(a,b,c);cout“area=“s“n”;#include double area(double x,double y,double z)double s;if (x+yz|x+zy|y+z1#includevoid main()int n;double y;cinn;if (n0) coutn0,data error!;

28、elsey=fac(n);coutn“!=“y;直接调用(1)写出调用终止条件(2)写出计算公式现在学习的是第33页,共66页double fac(int n) f=fac(n-1)*n; return f;void main()y = fac(n);double fac(int n) f=fac(n-1)*n; return f;double fac(int n) if (n=0|n=1) f=1; return f;321v执行过程现在学习的是第34页,共66页_有一个能结束递归调用的条件。有一个能结束递归调用的条件。_有一个递归调用语句有一个递归调用语句练习:用递归方法求Fibonacc

29、i数列的前n项。现在学习的是第35页,共66页_函数调用时,首先需要保存主调函数的现场和返回地址,然函数调用时,首先需要保存主调函数的现场和返回地址,然后程序转移到被调函数的起始地址开始执行。被调函数执行后程序转移到被调函数的起始地址开始执行。被调函数执行结束后,先回复主调函数的现场,取出返回地址并将返回值结束后,先回复主调函数的现场,取出返回地址并将返回值赋予函数调用本身。最后在返回地址处开始继续执行。赋予函数调用本身。最后在返回地址处开始继续执行。_对于函数体比较小且功能简单的函数,如果反复多次调用,对于函数体比较小且功能简单的函数,如果反复多次调用,系统开销也比较大。系统开销也比较大。_

30、内联函数,编译器在编译时,并不生成普通的函数,而是将内联函数,编译器在编译时,并不生成普通的函数,而是将程序中出现的内联函数的调用表达式用该内联函数的函数体程序中出现的内联函数的调用表达式用该内联函数的函数体进行替换,这样虽然可以增加目标代码量,但不会产生由于进行替换,这样虽然可以增加目标代码量,但不会产生由于函数调用而引起的在时间和空间中转来转去。函数调用而引起的在时间和空间中转来转去。现在学习的是第36页,共66页_在函数头前加关键字在函数头前加关键字 inline用内联函数计算圆面积。#include const double P=3.14;inline double area(doub

31、le r);void main()double r=3.0;double s;s=area(r);coutthe area is sendl;inline double area(double r)return P*r*r;现在学习的是第37页,共66页_内联函数也遵循定义在前,调用在后的原则。内联函数也遵循定义在前,调用在后的原则。_内联函数不允许有循环语句,内联函数不允许有循环语句,Switch语句等负责的语句,如语句等负责的语句,如有这些,则按普通函数处理有这些,则按普通函数处理_内联函数的函数体不可过大内联函数的函数体不可过大 15行为宜行为宜_递归函数不能被用作内联函数。递归函数不能

32、被用作内联函数。_类结构中,类体内定义的成员函数都是内联函数。类结构中,类体内定义的成员函数都是内联函数。现在学习的是第38页,共66页_求一个数的绝对值:求一个数的绝对值:Int abs(int)Long labs(long);Double fabs(double);_函数功能相同,但名称不同。函数功能相同,但名称不同。_重载函数:使得同一个函数名可以对应着不同的函数实现。重载函数:使得同一个函数名可以对应着不同的函数实现。_定义:所谓函数的重载就是指建立多个同名的函数,但函数定义:所谓函数的重载就是指建立多个同名的函数,但函数的形参表必须互不相同。的形参表必须互不相同。Int abs(in

33、t)Long abs(long);Double abs(double);现在学习的是第39页,共66页_重载函数至少要在参数类型、参数个数或参数顺序有所不同,重载函数至少要在参数类型、参数个数或参数顺序有所不同,仅仅是返回值类型不同时不够的。仅仅是返回值类型不同时不够的。Int fun(int ,double);Int fun(double,int);Void fun(int ,double)_重载函数的选择是按下述顺序查找的:将实参类型与所有别重载函数的选择是按下述顺序查找的:将实参类型与所有别调用的重载函数的形参一一比较,显示查找到调用的重载函数的形参一一比较,显示查找到一个严格匹配一个严

34、格匹配的,如找到了就调用该函数;再是通过的,如找到了就调用该函数;再是通过内部数据转换内部数据转换查找一查找一个匹配的,如找到了就调用该函数。最后是用过用户所定义个匹配的,如找到了就调用该函数。最后是用过用户所定义的的强制转换强制转换来查找一个匹配的。来查找一个匹配的。可以重载不可重载现在学习的是第40页,共66页_#include _int sum(int x,int y);_int sum(int x,int y,int z);_double sum(double x,double y);_double sum(double x,double y,double z);_void main(

35、)_coutsum(2,5)endl;_coutsum(2,4,7)endl;_coutsum(2.5,5.9)endl;_coutsum(2.9,5.4,3.4)endl;_int sum(int x,int y)return x+y;int sum(int x,int y,int z)return x+y+z;double sum(double x,double y)return x+y;double sum(double x,double y,double z)return x+y+z;现在学习的是第41页,共66页_C+C+中,允许在函数声明或定义时为一个或多个形参指定默认值,这样,当

36、进中,允许在函数声明或定义时为一个或多个形参指定默认值,这样,当进行函数调用时,如果省略了对应位置上的实参,则在执行被调函数时,以该行函数调用时,如果省略了对应位置上的实参,则在执行被调函数时,以该形参的默认值进行运算。形参的默认值进行运算。1.1.默认参数的声明:默认参数一般在函数声明中提高。如果程序中即有函数的声默认参数的声明:默认参数一般在函数声明中提高。如果程序中即有函数的声明,又有函数定义,则定义函数时不允许再指定默认值;如果程序中只有函明,又有函数定义,则定义函数时不允许再指定默认值;如果程序中只有函数的定义而没有函数的声明,则默认参数可出现在函数定义中。数的定义而没有函数的声明,

37、则默认参数可出现在函数定义中。Void point (int x=3,int y=4); /Void point (int x=3,int y=4); /声明中给出默认值声明中给出默认值Void point(int x,int y) /Void point(int x,int y) /定义中不可再指定默认值定义中不可再指定默认值2.2.默认参数的顺序:如果一个函数中有多个默认参数,则默认参数值的定义必须默认参数的顺序:如果一个函数中有多个默认参数,则默认参数值的定义必须遵循从右至左的顺序。即:如果函数的某个形参没有默认值,则它前面的参遵循从右至左的顺序。即:如果函数的某个形参没有默认值,则它前

38、面的参数就不能有默认值。数就不能有默认值。3.3.默认值可以使全局变量、全局常量,甚至可以是一个函数,但不能是局部变量默认值可以使全局变量、全局常量,甚至可以是一个函数,但不能是局部变量Void point (int =3,int=4);现在学习的是第42页,共66页_5.8.1 作用域作用域 _5.8.2 局部变量和全局变量局部变量和全局变量_5.8.3 生命期生命期现在学习的是第43页,共66页_函数原型作用域:作用范围:始于函数原型说明的左括号,函数原型作用域:作用范围:始于函数原型说明的左括号,结束与函数原型说明的右括号处。例如:结束与函数原型说明的右括号处。例如:#include v

39、oid main()int a=9,b=6;coutsum(a,b);int sum(int a,int b) return a+b;作用范围_块作用域:函数中一对花括号括起的代码区域。例如:形参、复合语句中声明的变量、函数体内声明的普通变量。现在学习的是第44页,共66页_函数作用域函数作用域:在该函数内任何地方可见。在该函数内任何地方可见。C+中,只有中,只有Goto语句的标号具有函数作用域。语句的标号具有函数作用域。_类作用域:类作用域:_文件作用域:在函数或类之外说明的标识符具有文件作用域,文件作用域:在函数或类之外说明的标识符具有文件作用域,其作用范围为从定义点开始,到文件结尾结束。

40、其作用范围为从定义点开始,到文件结尾结束。现在学习的是第45页,共66页#include int a;int sum(int x,int y)void main()int b=6;a=3;sum(a,b);coutab=0&a)t=sqrt(t);x1=(-b+t)/(2*a);x2=(-b-t)/(2*a);return 1;return 0;#include#include int root(double,double,double);double x1,x2;void main()double a,b,c;coutabc;if (root(a,b,c)cout“x1=“x1“tx2=“x

41、2“n”;现在学习的是第51页,共66页#includeint x=1,y=2,z=3;fun1 (int x) int z ; z = x+y; y=1; cout“x=“x“y=“y“z=“z; return z;void main() int a=10; x = fun1(a); coutx=“ x“y=“y“z=“z“n”;F全局变量F局部变量输出结果: x=10,y=1,z=12fun1(10)10 x10+2z1yx=12,y=1,z=3现在学习的是第52页,共66页一、存储类别一、存储类别二、局部变量的存储类别三、全局变量的存储类别四、作用域和生命期现在学习的是第53页,共66页

42、静态存储方式: 程序运行期间分配固定的存储空间的方式。动态存储方式: 程序运行期间根据需要进行动态的分配存储空间方式。程序区静态存储区动态存储区形参、自动局部变量、函数调用的现场等全局变量、静态局部变量现在学习的是第54页,共66页1、自动存储类型、自动存储类型auto自动变量存储在动态存储区;当函数被调用时随机分配存储空间,返回时释放(其初始化相当于一次赋值,函数每次被调用时都执行);是局部变量的缺省存储类型。2、静态存储类型static静态变量存储在静态存储区;在执行程序的整个过程中,不管函数是否被调用,都占据其存储空间;只初始化一次3、外部存储类型extern全局变量的缺省类型为exte

43、rn类型4、寄存器存储类型register寄存器变量存储在寄存器中(cpu中),因寄存器数量有限,该种变量个数不能多。现在学习的是第55页,共66页#include fun1(int x)static int y;int z = 10;x = x+y; y = x+z;cout“x=“x“y=“y“z=“z“n”;void main()fun1(1);fun1(1);输出结果:x=1,y=11,z=10 x=12,y=22,z=10静态变量只初始化一次现在学习的是第56页,共66页#include fun1(int k)int n=1;static m=1;n+=k;m+=k;cout“nn=

44、“n“tm=“m;void main()fun1(8);fun1(8);fun1(8);输出结果:n=9m=9n=9m=17静态变量只初始化一次n=9m=25现在学习的是第57页,共66页#include fun1(int k)int n;static int m;n=1;m=1;n+=k;m+=k;coutnn=“n“tm=“m;void main()fun1(8);fun1(8);fun1(8);输出结果:n=9m=9n=9m=9n=9m=9现在学习的是第58页,共66页_外部变量存储在静态存储区,外部变量存储在静态存储区,(改变作用域改变作用域)_静态外部变量静态外部变量 static静

45、态外部变量作用域为本程序文件,其它程序文件不能静态外部变量作用域为本程序文件,其它程序文件不能使用使用_外部变量外部变量 extern外部变量除本程序文件使用外,也可被其它程序文件外部变量除本程序文件使用外,也可被其它程序文件使用使用全局变量的声明:在定义外部变量之前使用该变量,需对其声明 extern 数据类型 变量名表;_注意:用extern声明只是起一个说明作用,不产生新变量,与定义变量不同现在学习的是第59页,共66页/文件file1.cpp #include int a; /全局变量 int power(int n); / 原型说明 void main ( ) int b = 3,c

46、,d,m; cout a m; c = a*b; coutabcendl; d = power(m); cout amd; /文件file2.cppextern int a; int power(int n) int i,y = 1; for (i=1;i=n;i+) y *= a; return y; 输入变量a和m的值,求ab和am的值现在学习的是第60页,共66页_利用静态变量求利用静态变量求1!+2!+5!阶乘。!阶乘。现在学习的是第61页,共66页编译预处理指令使编译程序在对源程序进行通常的编译前,先对编译预处理指令使编译程序在对源程序进行通常的编译前,先对这些命令进行预处理,然后将

47、预处理的结果和源程序进行通常的这些命令进行预处理,然后将预处理的结果和源程序进行通常的编译处理。编译处理。C+提供的编译预处理指令有:提供的编译预处理指令有:宏定义宏定义文件包含文件包含条件编译条件编译这些指令均以这些指令均以#开头,每行一条指令,指令后无分号。开头,每行一条指令,指令后无分号。现在学习的是第62页,共66页1.不带参数的宏定义不带参数的宏定义_#define 标识符标识符 字符串字符串_标识符简称宏名,字符串可以是常量、关键字、语标识符简称宏名,字符串可以是常量、关键字、语句、表达式、空字符等。例如:句、表达式、空字符等。例如:_#define Pi 3.14159_说明说明

48、 宏名一般使用大写字符,以和普通变量区分宏名一般使用大写字符,以和普通变量区分 宏展开时之作简单的替换,不作语法检查宏展开时之作简单的替换,不作语法检查 宏定义不是宏定义不是C+语句。语句。 通常把通常把#define命令放在一个文件的开头,使其命令放在一个文件的开头,使其定义在本文件内全部有效。定义在本文件内全部有效。 如果希望某一宏名之在文件的部分区域起作用,如果希望某一宏名之在文件的部分区域起作用,可以使用取消宏定义指令:可以使用取消宏定义指令: #undef 宏名宏名 /其功能是通知预处理系统取消前面由其功能是通知预处理系统取消前面由#define所定义的宏名。所定义的宏名。 宏定义允

49、许嵌套定义宏定义允许嵌套定义#include #define R 3.0#define Pi 3.14159#define L 2*Pi*R#define S Pi*R*Rvoid main()cout L=Lendl;cout S=Sy)x:y#define X(a,b) 2*a+b_注意:注意:宏定义时,宏名和带参数的小括号之间不应加空格,否宏定义时,宏名和带参数的小括号之间不应加空格,否则空格以后的内容都作为宏体出现则空格以后的内容都作为宏体出现为了避免错误,带运算符的参数要用圆括号括起来为了避免错误,带运算符的参数要用圆括号括起来现在学习的是第64页,共66页#include #def

50、ine F(x,y) (2*x+y)void main()int a=3,b=2;int s;s=F(a,b)*F(a,b);coutsendl;#include #define F(x,y) 2*x+yvoid main()int a=3,b=2;int s;s=F(a,b)*F(a,b);coutsendl;#include #define F(x,y) (2*(x)+(y)void main()int a=3,b=2;int s;s=F(a+b,a+b)*F(a,b);coutsendl;#include #define F(x,y) (2*x+y)void main()int a=3,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁