《C语言基础知识函数.pptx》由会员分享,可在线阅读,更多相关《C语言基础知识函数.pptx(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、结构化程序设计概述结构化程序设计概述 结构化程序设计要求一种自顶向下的设计方法,也就是将复杂结构化程序设计要求一种自顶向下的设计方法,也就是将复杂的系统划分为相对独立的,功能较为单一功能的子系统的组合。的系统划分为相对独立的,功能较为单一功能的子系统的组合。每个子系统称为模块,在每个子系统称为模块,在C语言中表现为函数。语言中表现为函数。复杂问题main()abca1a2b1b2c1c2各模块之间的关系称之为接口。各模块之间的关系称之为接口。优点:优点:函数实现的功能单一函数实现的功能单一完整,可以独立设计,单完整,可以独立设计,单独调试。易于维护,通用独调试。易于维护,通用性强。性强。第1页
2、/共37页函数特点:函数特点:1.1.一段相对独立的程序,但不能独立运行。一段相对独立的程序,但不能独立运行。建立函数称为建立函数称为“函数的定义函数的定义”,使用函数称为,使用函数称为“函数函数的调用的调用”;调用其他函数的函数称为;调用其他函数的函数称为“主调函数主调函数”,被调,被调用的函数称为用的函数称为“被调函数被调函数”。除主函数外,其他函数都不。除主函数外,其他函数都不能独立运行。能独立运行。2.2.库函数与自定义函数库函数与自定义函数 被调用的函数可以是系统提供的被调用的函数可以是系统提供的库函数库函数(C(C标准中提供标准中提供300300多个库函数多个库函数),也可以是用户
3、根据需要自己编写设计的,也可以是用户根据需要自己编写设计的函数(本章内容)。函数(本章内容)。3.3.mainmain函数(主函数)是每个程序执行的起始点函数(主函数)是每个程序执行的起始点 mainmain(系统定义)函数可以调用其他任何函数,但不(系统定义)函数可以调用其他任何函数,但不能被其他任何函数所调用。一个能被其他任何函数所调用。一个C C程序总是从程序总是从mainmain函数开始函数开始执行(不论执行(不论mainmain函数在程序中的位置),在函数在程序中的位置),在mainmain函数中结函数中结束。束。第2页/共37页5.1概概述述函数的基本结构函数的基本结构#inclu
4、devoidmain(void)inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“%d”c);intmax(intx,inty)intz;z=x=y?x:y;return(z);主主函函数数函函数数体体函数的类型,返回值的类型。函数的类型,返回值的类型。函数名(用标识符命名),引用函数的函数名(用标识符命名),引用函数的标志,并得到结果。标志,并得到结果。函数参数说明表。函数参数说明表。定义!定义!引用!引用!函数定义是要确定函数的函数定义是要确定函数的名称、函数的类型、函数的参名称、函数的类型、函数的参数及函数的功能。数及函数的功能。第3页/共
5、37页函数定义的功能函数定义的功能函数定义是要确定如下四点:函数定义是要确定如下四点:名称名称函数的类型函数的类型函数的参数函数的参数函数的功能函数的功能第4页/共37页函数的定义函数的定义格式:格式:type函数名函数名(参数说明表参数说明表)内部说明语句内部说明语句;功能语句功能语句;如果函数有返回值,应含有如果函数有返回值,应含有return语语句。句。intmax(intx,inty)intz;z=x=y?x:y;return(z);说明:说明:函数不能嵌套定义,但可以嵌套引用,包括引用自己。函数不能嵌套定义,但可以嵌套引用,包括引用自己。intmax(intx,inty)intcx(
6、intc,intd)/*Error!*/函数如果无返回值,函数如果无返回值,type应说明为空类型应说明为空类型void。函数无参。函数无参数应定义成数应定义成void。void Bell(void)printf(“007”);第5页/共37页函数的引用函数的引用引用方式:引用方式:函数名函数名(实参表实参表)一般引用方式有三种:一般引用方式有三种:v语语句句形形式:式:max(a,b);v表达式形式:表达式形式:c=max(a,b)*2;v函函数数参参数:数:c=max(a,max(b,d);第6页/共37页引用过程引用过程voidmain(void)inta,b,c;scanf(“%d,%
7、d”,&a,&b);c=max(a,b);printf(“%5d”,c);intmax(intx,inty)intz;z=xy?x:y;return(z);先计算实参的值,从右向左向函数传递调赋值给形参。先计算实参的值,从右向左向函数传递调赋值给形参。23abXy23转移在函数中运行,执行到一个转移在函数中运行,执行到一个return语句,将返回表达式语句,将返回表达式的值。由函数名带回给调用函数。的值。由函数名带回给调用函数。z3函数如果没有函数如果没有return语句,由最后一个语句,由最后一个返回一个不确定的值!返回一个不确定的值!第7页/共37页关于返回值的几点说明:关于返回值的几点说
8、明:函数可以通过一个函数可以通过一个return语句返回一个值,也可以不返回值,语句返回一个值,也可以不返回值,此时应在定义函数时用此时应在定义函数时用void类型加以说明。类型加以说明。函数中可以出现多个函数中可以出现多个return语句,遇到一个语句,遇到一个return语句,则语句,则返回值,且返回调用函数,继续执行。返回值,且返回调用函数,继续执行。intmax(intx,inty)if(x=y)returnx;returny;返回值的类型应与函数的类型一致,如不一致,以函数类型返回值的类型应与函数的类型一致,如不一致,以函数类型为准,为准,先转换为函数类型后,先转换为函数类型后,再返
9、回。再返回。intmax(void)floatz;returnz;/*z先转化为整型先转化为整型*/为了确保参数和返回值类型正确,一般须在函数调用前对其为了确保参数和返回值类型正确,一般须在函数调用前对其类型和参数的类型加以说明,该说明称之为类型和参数的类型加以说明,该说明称之为原型声明原型声明。intimax(int,int);voidmain(void)intx,y,z;z=imax(x,y);原型声明语句,加;原型声明语句,加;第8页/共37页举例:通过函数求举例:通过函数求xn。#includedoublepow(float,int);voidmain(void)inti;for(i=
10、1;i=9;i+)printf(“%d,%fn”,i,pow(2.5,i);doublepow(floatx,intn)inti;doublep=1;for(i=1;i=n;i+)p=p*x;return(p);原型声明。原型声明。定定义义函函数数调用函数。调用函数。CHAP6EX1第9页/共37页5.2函数间的数据传递函数间的数据传递函数在调用的过程中,调用函数和被调函数存在数据的相互传函数在调用的过程中,调用函数和被调函数存在数据的相互传递。数据的传递包括两个方面:递。数据的传递包括两个方面:将值传递给被调函数;将值传递给被调函数;将被调函数的结果返回给调用函数。将被调函数的结果返回给调用
11、函数。调用函数调用函数被调函数被调函数向被调函数传递值。向被调函数传递值。将结果返回给调用函数。将结果返回给调用函数。第10页/共37页函数间数据传递函数间数据传递通过函数参数传值或传地址;通过函数参数传值或传地址;通过通过全局变量全局变量传递参数或结果。传递参数或结果。第11页/共37页使用参数传递数据使用参数传递数据传值方式传值方式 通过实参与形参的结合,将通过实参与形参的结合,将数据值传递给形参数据值传递给形参,形参的改变不,形参的改变不影响实参。影响实参。#includeintsplus(int,int);voidmain(void)inta,b,c;scanf(“%d,%d”,&a,
12、&b);c=splus(a,b);printf(“%d,%d,a*b=%dn”,a,b,c);intsplus(intx,inty)intz,a,b;z=x+y;a=x+y;b=y+x;return(z);调调用用函函数数被被调调函函数数x、y形参。形参。a、b实参变量的值。实参变量的值。传递参数传递参数a:2b:3y:x:32z:5返回值返回值第12页/共37页#include#includeintswap(int,int);intswap(int,int);voidmain(void)voidmain(void)inta,b;inta,b;a=10;b=20;a=10;b=20;swap(
13、a,b);swap(a,b);printf(“a=%d,b=%dn”,a,b);printf(“a=%d,b=%dn”,a,b);intintswapswap(int(inta,intb)a,intb)intz;intz;z=a;a=b;b=z;z=a;a=b;b=z;调调调调用用用用函函函函数数数数被被被被调调调调函函函函数数数数结果:结果:a=10,b=20a=10,b=20从中可以看出,单值传递时,形参变量值的变化不会影响实参变量的值。从中可以看出,单值传递时,形参变量值的变化不会影响实参变量的值。从中可以看出,单值传递时,形参变量值的变化不会影响实参变量的值。从中可以看出,单值传递时,
14、形参变量值的变化不会影响实参变量的值。又例:定义交换两变量值的函数,并调用该函数又例:定义交换两变量值的函数,并调用该函数又例:定义交换两变量值的函数,并调用该函数又例:定义交换两变量值的函数,并调用该函数。第13页/共37页(2)地址传递方式地址传递方式形参实参均为地址(数组名、指针),数据在主调函数和被调形参实参均为地址(数组名、指针),数据在主调函数和被调函数中占据相同的存储单元,形参的改变将影响到实参函数中占据相同的存储单元,形参的改变将影响到实参。#includevoidmain()voidfun(intb);inta10,i;for(i=0;i10;i+)scanf(“%d”,&a
15、i);fun(a);for(i=0;i10;i+)printf(“%d”,ai);voidfun(intb)intmax,k,i;max=b0;k=0;for(i=1;i10;i+)if(maxbi)max=bi;k=i;max=b0;b0=bk;bk=max;return;ab2000H2012Hab2000H2002H2482000H例例例例:将数组中的最大值与将数组中的最大值与将数组中的最大值与将数组中的最大值与第一个数交换第一个数交换第一个数交换第一个数交换第14页/共37页全局变量传递参数全局变量传递参数全局变量可以被调用函数和被调函数全局变量可以被调用函数和被调函数共享共享,任何函
16、数对全局变,任何函数对全局变量的修改都会量的修改都会影响到其他函数所见的全局变量的值。影响到其他函数所见的全局变量的值。#includeintc;voidmain(void)inta,b;scanf(“%d,%d”,&a,&b);splus(a,b);printf(“a*b=%dn”,c);voidsplus(intx,inty)c=x*y;说明全局变量说明全局变量c6 说明:说明:应尽量少用全局变量,应使函数内部的内聚性强,函数应尽量少用全局变量,应使函数内部的内聚性强,函数之间的偶合性弱。之间的偶合性弱。第15页/共37页5.3变量的存储类型及作用域变量的存储类型及作用域变量是内存数据的抽
17、象,即将内存地址、数据表示变量是内存数据的抽象,即将内存地址、数据表示抽象成一个抽象成一个符号。符号。此外,变量还有此外,变量还有存储类型存储类型,存储类型确定了变量在,存储类型确定了变量在时间上的时间上的生存期和空间上的作用域。生存期和空间上的作用域。按空间的作用域可分为:按空间的作用域可分为:全局变量全局变量局部变量局部变量按时间的生存期可分为:按时间的生存期可分为:静态存储变量静态存储变量动态存储变量动态存储变量第16页/共37页变量的四种存储类型变量的四种存储类型变量的说明格式:变量的说明格式:存储类型存储类型 类型类型 变量名表;变量名表;确定变量在内存中的表示方法。确定变量在内存中
18、的表示方法。确定变量的生存期和作用域。确定变量的生存期和作用域。该项省略表示该项省略表示auto存储类型。存储类型。自动类型自动类型auto寄存器类型寄存器类型register静态类型静态类型static外部类型外部类型extern第17页/共37页auto存储类型存储类型(局部变量局部变量)定义在复合语句的开始处。块内生存、块内有效。定义在复合语句的开始处。块内生存、块内有效。#includevoidmain(void)autointa,b;scanf(“%d,%d”,&a,&b);if(ba)intiTemp;iTemp=a;a=b;b=iTemp;printf(“Max=%d”,a);a
19、b的的作作用用域域iTemp的作用域。的作用域。生存期:生存期:执行到复合语句建立内存执行到复合语句建立内存变量。执行出复合语句变量消变量。执行出复合语句变量消亡。亡。iTempregister存储类型存储类型(局部变量局部变量)作用域和生存期和作用域和生存期和auto相同,相同,差别在于,如果差别在于,如果CPU内部的寄存内部的寄存器空闲,器空闲,则使用寄存器作为变量则使用寄存器作为变量的存储单元,以提高速度。主要的存储单元,以提高速度。主要用于循环变量,且应该是整型和用于循环变量,且应该是整型和字符型。字符型。第18页/共37页局部局部static(静态静态)存储类型存储类型作用域:作用域
20、:在说明的复合语句内引用,出了复合语句不可见。在说明的复合语句内引用,出了复合语句不可见。生存期:生存期:从程序开始运行直到程序结束,执行出从程序开始运行直到程序结束,执行出时,原值时,原值并不消失,只是不能引用。并不消失,只是不能引用。voidrow(void);voidmain(void)intb;for(b=1;b=9;b+)row();voidrow(void)inta=1;intb;for(b=1;b=9;b+)printf(“%5d”,a*b);printf(“n”);a+;CHAP6EX6staticCHAP6EX5说明静态变量。说明静态变量。a的的作作用用域域生生存存期期从从编
21、编译译开开始始到到程程序序结结束束。第19页/共37页外部变量(外部变量(extern存储类型、全局变量)存储类型、全局变量)外部变量是定义在任何模块之外的变量。也称为外部变量是定义在任何模块之外的变量。也称为全局变量。全局变量。作用域:作用域:从说明变量开始直到文件结束。从说明变量开始直到文件结束。生存期:生存期:在程序的整个执行过程中。任何函数对外部变量的修在程序的整个执行过程中。任何函数对外部变量的修改都会影响其他函数对外部变量引用时的值。改都会影响其他函数对外部变量引用时的值。#includevoidadd(void);inta,b,c;voidmain(void)scanf(“%d,
22、%d”,&a,&b);add();printf(“%d”,c);voidadd(void)c=a+b;全局变量。全局变量。作作用用域域第20页/共37页全局变量应用举例:用函数交换两个全局变量的值。全局变量应用举例:用函数交换两个全局变量的值。#includeinta,b;voidmain(void)scanf(“%d,%d”,&a,&b);fun();printf(“a=%d,b=%dn”,a,b);voidfun(void)intc;c=a;a=b;b=c;a、b外部变量。外部变量。ab第21页/共37页全局变量的副作用全局变量的副作用#includeinti;voidprt(void);
23、voidmain(void)for(i=0;i5;i+)prt();voidprt(void)for(i=0;i5;i+)printf(“%c”,*);printf(“n”);函数的作用:打印五个函数的作用:打印五个*,再回车。,再回车。几次调用函数?几次调用函数?i=0i=0i=0i=0i=0i=1i=2i=3i=4i=5i=5i=5i=5i=5第22页/共37页5.4数组与函数数组与函数数组作为函数参数有两种方式:数组作为函数参数有两种方式:数据元素作为函数参数;数据元素作为函数参数;数据名作为函数参数数据名作为函数参数数组名作为函数参数定义有三种方式:数组名作为函数参数定义有三种方式:形
24、参为指针;形参为指针;intave(int*p)形参为无下标数组;形参为无下标数组;intave(inta)形参为有下标数组。形参为有下标数组。intave(inta10)第23页/共37页1.1.数组元素作函数实参(同普通变量)数组元素作函数实参(同普通变量)数组元素作函数实参(同普通变量)数组元素作函数实参(同普通变量)#include#include voidtest(intx)voidtest(intx)/*/*定义一个无返回值函数定义一个无返回值函数定义一个无返回值函数定义一个无返回值函数,其形参为整型,其形参为整型,其形参为整型,其形参为整型*/printf(“%d”,(x0)?x
25、:0);printf(“%d”,(x0)?x:0);voidvoid main(void)main(void)inta5,i;inta5,i;printf(“input5numbern”);printf(“input5numbern”);for(i=0;i5;i+)for(i=0;i5;i+)scanf(“%d”,&ai);scanf(“%d”,&ai);test(ai);test(ai);/*/*每输入一个值,调用一次每输入一个值,调用一次每输入一个值,调用一次每输入一个值,调用一次test,test,实参为实参为实参为实参为该数组元素该数组元素该数组元素该数组元素*/第24页/共37页举例
26、:通过函数求数组元素的平均值。举例:通过函数求数组元素的平均值。#includefloatmean(intdata,int);voidmain(void)intarray10=1,2,3,4,5,6,7,8,9,10;floatav;av=mean(array,10);printf(“av=%fn%d”,av,array0);floatmean(intdata,intnum)inti;floatavg=0;for(i=0;inum;i+)avg+=datai;avg/=num;return(avg);1.形参为无下标数组;形参为无下标数组;无下标数组。无下标数组。data0=-1;intdat
27、a10形参为有下标数组。形参为有下标数组。2.形参为有下标数组。形参为有下标数组。说明:说明:二种方法的实质都是传递地址,二种方法的实质都是传递地址,可以混用。可以混用。形参的任何改变都影响实参。形参的任何改变都影响实参。函数中对数组的操作,下标不要函数中对数组的操作,下标不要超过数组的下标范围。超过数组的下标范围。2.2.数组名作为函数参数数组名作为函数参数数组名作为函数参数数组名作为函数参数(一维、二维、字符数组)一维、二维、字符数组)一维、二维、字符数组)一维、二维、字符数组)chp6ex2第25页/共37页5.55.5函数的嵌套调用和递归调用函数的嵌套调用和递归调用函数的嵌套调用和递归
28、调用函数的嵌套调用和递归调用5.5.15.5.1函数的嵌套调用函数的嵌套调用函数的嵌套调用函数的嵌套调用CC语言不允许嵌套定义。但允许函数嵌套调用,即被调函数中又调用其它函数。语言不允许嵌套定义。但允许函数嵌套调用,即被调函数中又调用其它函数。语言不允许嵌套定义。但允许函数嵌套调用,即被调函数中又调用其它函数。语言不允许嵌套定义。但允许函数嵌套调用,即被调函数中又调用其它函数。mianmian函数函数函数函数调用调用调用调用aa函数函数函数函数结结结结 束束束束aa函数函数函数函数调用调用调用调用bb函数函数函数函数bb函数函数函数函数两层嵌套的执行过程两层嵌套的执行过程两层嵌套的执行过程两层
29、嵌套的执行过程第26页/共37页例:求三个数中最大数和最小数的差值。例:求三个数中最大数和最小数的差值。例:求三个数中最大数和最小数的差值。例:求三个数中最大数和最小数的差值。#include#includeintdif(intx,inty,intz);intdif(intx,inty,intz);intmax(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);intmin(intx,inty,intz);voidmain()voidmain()inta,b,c,d;inta,b,c,d;scanf(%d%d%d,&a,
30、&b,&c);scanf(%d%d%d,&a,&b,&c);d=dif(a,b,c);d=dif(a,b,c);printf(Max-Min=%dn,d);printf(Max-Min=%dn,d);intdif(intx,inty,intz)intdif(intx,inty,intz)returnmax(x,y,z)-min(x,y,z);returnmax(x,y,z)-min(x,y,z);intmax(intx,inty,intz)intmax(intx,inty,intz)intr;intr;r=xy?x:y;r=xy?x:y;return(rz?r:z);return(rz?r:z
31、);intmin(intx,inty,intz)intmin(intx,inty,intz)intr;intr;r=xy?x:y;r=xy?x:y;return(rz?r:z);return(r1f(n)=1n=0或或n=1nf(n-1)n1#includelonglfac(long);voidmain(void)longi,x;scanf(“%ld”,&i);x=lfac(i);printf(“n%ld”,x);longlfac(longn)if(n=0|n=1)return1;elsereturn(n*lfac(n-1);lfac(4)4*lfac(3)3*lfac(2)2*flac(1)
32、2*13*2*14*3*2*1递推递推回归回归第29页/共37页5.5编译预处理编译预处理C语言除了说明语句、执行语句及控制语句外,还有一类语言除了说明语句、执行语句及控制语句外,还有一类编译编译预处理语句预处理语句。该类语句的作用是。该类语句的作用是在编译时对程序作一定的处理在编译时对程序作一定的处理,满,满足特定的处理要求。编译预处理是足特定的处理要求。编译预处理是C语言的重要特征。语言的重要特征。编译预处理语句的语法形式:编译预处理语句的语法形式:#关键词关键词参数表参数表编译预处理语句不用;作为结束标志!编译预处理语句不用;作为结束标志!宏定义预处理宏定义预处理不带参数的宏定义不带参数
33、的宏定义作用:作用:定义常量名,提高程序的可读性,便于修改。定义常量名,提高程序的可读性,便于修改。格式:格式:#define宏名宏名字符串字符串#definePI3.1415926voidmain(void)floatr;scanf(“%f”,&r)printf(“%fn”,PI*r*r);编译时用字符串替代宏名。编译时用字符串替代宏名。3.1415926第30页/共37页说明:说明:宏名一般用大写;宏名一般用大写;编译时用字符串无条件替代宏名;编译时用字符串无条件替代宏名;#definePI3.1415926;PI*r*r3.1415926;*r*r宏名的有效范围,从定义到程序尾。也可以通
34、过宏名的有效范围,从定义到程序尾。也可以通过#undef修改修改定义范围。定义范围。#defineG9.8voidmain(void)#undefGG的的范范围围可以在宏定义的字符串中使用已定义的宏名。可以在宏定义的字符串中使用已定义的宏名。”字符串中的宏名不替换。字符串中的宏名不替换。#defineR3.0#definePI3.14159#defineSPI*R*Rprintf(“S=%f”,S);不替换。不替换。第31页/共37页带参数的宏定义带参数的宏定义格式:格式:#define宏名宏名(参数表参数表)含参数的字符串含参数的字符串#defineS(a,b)a*barea=S(4,3);
35、替换过程:替换过程:将实际参数替换宏定义的参数。将实际参数替换宏定义的参数。替换字符串中的参数。替换字符串中的参数。替换整个宏。替换整个宏。4*3带参的宏与函数的区别:带参的宏与函数的区别:带参宏不分配内存单元,不返回值,只是在编译时按规则替换。带参宏不分配内存单元,不返回值,只是在编译时按规则替换。关于带参宏的说明:关于带参宏的说明:要严格按格式书写,否则会造成错误。要严格按格式书写,否则会造成错误。#defineS(a,b)a*bS(3,4)被替换成:被替换成:(a,b)a*b(3,4)参数有可能用到表达式时,参数字符要加()。参数有可能用到表达式时,参数字符要加()。#defineS(r
36、)PI*r*rS(a+b)替换为:替换为:PI*a+b*a+b#defineS(r)PI*(r)*(r)S(a+b)替换为:替换为:PI*(a+b)*(a+b)第32页/共37页文件包含文件包含格式:格式:#include#include”被包含的文件名被包含的文件名”表示编译系统定义路径;表示编译系统定义路径;“”表示用户指明路径。表示用户指明路径。作用:作用:将指定的文件的内容和当前文件一起编译。将指定的文件的内容和当前文件一起编译。说明:说明:一个一个#include只能包含一个文件。只能包含一个文件。被包含文件可以嵌套包含文件。被包含文件可以嵌套包含文件。一般将宏定义及函数的原型声明放
37、在包含文件中。一般将宏定义及函数的原型声明放在包含文件中。被包含的文件一般扩展名为被包含的文件一般扩展名为.h,称为头文件。,称为头文件。第33页/共37页文件包含举例:求半径为文件包含举例:求半径为r的园面积、园周长。的园面积、园周长。#include“my.h”voidmain(void)doubler,fArea,fLen;scanf(“%lf”,&r);fArea=S(r);fLen=L(r);printf(“Area=%f,Len=%f”,fArea,fLen);doubleS(doubler)returnPI*r*r;doubleL(doubler)return2*PI*r;#in
38、clude#definePI3.1415926doubleS(double);doubleL(double);第34页/共37页条件编译条件编译C语言可以通过条件控制,让编译系统编译不同的程序段,从语言可以通过条件控制,让编译系统编译不同的程序段,从而提高程序的移植性并方便调试。而提高程序的移植性并方便调试。条件编译有三种形式:条件编译有三种形式:#ifdef标识符标识符programseg1#elseprogramseg2#endif#ifndef标识符标识符programseg1#elseprogramseg2#endif123#if表达式表达式programseg1#elseprogra
39、mseg2#endif条件?条件?满足满足编译程序段编译程序段1不满足不满足编译程序段编译程序段2第35页/共37页举例:通过条件编译选择求最大值或最小值举例:通过条件编译选择求最大值或最小值#includevoidmain(void)inta,b;scanf(“%d,%d”,&a,&b);#ifdefMAXprintf(“%d”,a=b?a:b);#elseprintf(“%d”,a=b?a:b);#endif#defineMAX#includevoidmain(void)inta,b;scanf(“%d,%d”,&a,&b);printf(“%d”,a=b?a:b);第36页/共37页感谢您的观看!第37页/共37页