C程序设计C程序设计 (35).pdf

上传人:刘静 文档编号:52828489 上传时间:2022-10-23 格式:PDF 页数:40 大小:1.69MB
返回 下载 相关 举报
C程序设计C程序设计 (35).pdf_第1页
第1页 / 共40页
C程序设计C程序设计 (35).pdf_第2页
第2页 / 共40页
点击查看更多>>
资源描述

《C程序设计C程序设计 (35).pdf》由会员分享,可在线阅读,更多相关《C程序设计C程序设计 (35).pdf(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C C程序设计程序设计Programming in CProgramming in C调用函数原型与声明调用函数原型与声明1、函数声明和原型2、库函数调用C C程序设计程序设计程序设计程序设计3 34.3 4.3 函数原型与调用函数原型与调用当要调用函数时,C语言规定在调用一个函数之前必须有该函数的声明。最好的函数声明形式就是函数原型。4 44.3.1 4.3.1 函数声明和函数原型函数声明和函数原型1函数声明编译器在编译函数调用时,需要检查函数接口,即返回类型、参数类型、参数次序、参数数目是否正确,这样就能避免参数类型、参数数目不一致而引发的错误。保证正确的函数调用栈。而编译器之所以能够发现

2、这些错误,原因就在于它事先有了该函数的声明,进而知道函数接口是如何规定的。5 54.3.1 4.3.1 函数声明和函数原型函数声明和函数原型一个函数只能定义一次,但是可以声明多次。定义是函数实现,函数代码一经实现,就不能再来一次。但声明的作用是程序向编译器提供函数的接口信息,因而多次提供接口信息是允许的,但不能提供相互矛盾、语义不一致的接口信息。6 64.3.1 4.3.1 函数声明和函数原型函数声明和函数原型C语言规定函数定义语法既是函数定义,也是函数声明。换言之,只要函数调用是写在函数定义的后面,就自然有了函数声明。但这种方式与C语言允许函数定义可放在任意位置的规定矛盾了,而且使用起来也不

3、方便。显然,将函数调用均写在函数定义的后面不是现实的方法。7 74.3.1 4.3.1 函数声明和函数原型函数声明和函数原型一般情况下,将函数声明放在头文件(.h)中,将函数实现放在源程序文件中。凡是要调用这个函数的地方,通过#include将头文件包含即可。8 84.3.1 4.3.1 函数声明和函数原型函数声明和函数原型另一方面,C语言允许调用库函数,所谓库函数是指事先由程序员编制好的函数。多数情况下,基于各种理由,如保护知识产权,这些库函数仅提供二进制形式的目标代码给调用者链接,却没有提供源码形式的函数定义。这种情况下,又如何让调用者有函数声明呢?方法是使用函数原型。9 94.3.1 4

4、.3.1 函数声明和函数原型函数声明和函数原型2函数原型函数原型(function prototype)的作用是提供函数调用所必须的接口信息,使编译器能够检查函数调用中可能存在的问题,有两种形式:第一种形式:第二种形式:返回类型返回类型 函数名函数名(类型1类型1 参数名1参数名1,类型2类型2 参数名2参数名2,.);,.);返回类型返回类型 函数名函数名(类型1类型1,类型2类型2,.);,.);10104.3.1 4.3.1 函数声明和函数原型函数声明和函数原型显然第二种形式是第一种形式的简写,之所以在函数原型中可以不写参数名称,是因为参数名称不是形参与实参对应的依据,因而参数名称不是重

5、要的接口信息,可以省略。语法后面的分号(;)必须要写。11114.3.1 4.3.1 函数声明和函数原型函数声明和函数原型例如:是标准库求平方根的函数原型,表示调用它需要:包含头文件math.h,因为sqrt函数原型在math.h中。sqrt函数须提供一个double型的实参,返回值也是double型。#include double#include double sqrtsqrt(doubledouble x x););12124.3.1 4.3.1 函数声明和函数原型函数声明和函数原型【例4.3】编写求两个数的最大公约数的函数。13134.3.1 4.3.1 函数声明和函数原型函数声明和函数

6、原型例4.31#include#include 2 intint gcdgcd(intint m m,intint n n););/gcd函数原型,gcd函数声明在前/gcd函数原型,gcd函数声明在前3 intint mainmain()()4 5 intint m m,n n;6 scanfscanf(%d%d,&(%d%d,&m m,&,&n n););7 printfprintf(%d(%dnn,gcdgcd(m m,n n););/调用时已有gcd函数声明/调用时已有gcd函数声明8 returnreturn 0 0;9 10 intint gcdgcd(intint m m,int

7、int n n)/求最大公约数,gcd函数实现在后/求最大公约数,gcd函数实现在后11 12 intint r r;13 whilewhile(n n!=!=0 0)/欧几里德算法(Euclidean algorithm),原理是:/欧几里德算法(Euclidean algorithm),原理是:14 r r=m m%n n;/r为m/n的余数/r为m/n的余数15 m m=n n;/则gcd(m,n)=gcd(n,r)=./则gcd(m,n)=gcd(n,r)=.14144.3.1 4.3.1 函数声明和函数原型函数声明和函数原型例4.316 n n=r r;/r=0时n即是gcd/r=0

8、时n即是gcd17 18 returnreturn m m;19 15154.3.1 4.3.1 函数声明和函数原型函数声明和函数原型10 intint gcdgcd(intint m m,intint n n)/求最大公约数,gcd函数实现在后/求最大公约数,gcd函数实现在后11 12 intint r r;13 whilewhile(n n!=!=0 0)/欧几里德算法(Euclidean algorithm),原理是:/欧几里德算法(Euclidean algorithm),原理是:14 r r=m m%n n;/r为m/n的余数/r为m/n的余数15 m m=n n;/则gcd(m,

9、n)=gcd(n,r)=./则gcd(m,n)=gcd(n,r)=.16 n n=r r;/r=0时n即是gcd/r=0时n即是gcd17 18 returnreturn m m;19 第2行即是gcd函数的函数原型,第10行第19行是gcd函数定义(函数实现)。16164.3.1 4.3.1 函数声明和函数原型函数声明和函数原型函数原型属于C语言的声明部分,因此,必须放在函数或语句块中所有执行语句的前面,或者函数外的全局范围内。函数原型几乎就是函数定义中的函数头,但函数头后面不能有分号,而函数原型没有函数体。函数定义与函数原型是有区别的,函数定义具有函数原型的声明作用,但它还是函数功能的具体

10、实现,所有函数定义是主体,函数原型像是它的“说明书”。17174.3.1 4.3.1 函数声明和函数原型函数声明和函数原型函数原型通常出现在函数定义的前面,也允许在函数定义的后面,只不过意义不大。编译器在编译时,无论它们哪个在前,均以第一次“看到”的函数接口为准,,如果后面的与这个函数接口不一致,就会出现编译错误,所以函数原型要与函数定义匹配。18184.3.1 4.3.1 函数声明和函数原型函数声明和函数原型3函数调用有了函数声明,就可以调用函数,有参数函数调用的形式为:实参可以是常量、变量、表达式和函数调用,各实参之间用逗号(,)分隔。实参的类型、次序、个数应与形参一致。函数名函数名(实参

11、列表实参列表););19194.3.1 4.3.1 函数声明和函数原型函数声明和函数原型无参数函数调用的形式为:函数名后面的括号()必须有,括号内不能有任何参数。函数名函数名();();20204.3.1 4.3.1 函数声明和函数原型函数声明和函数原型在C语言中,可以用以下几种方式调用函数。(1)函数表达式。函数调用作为其中的一项出现在表达式中,以函数返回值参与表达式的运算,这种方式要求函数必须是有返回值的。例如:z z=maxmax(x x,y y)21214.3.1 4.3.1 函数声明和函数原型函数声明和函数原型(2)函数调用语句。函数调用的语法形式加上分号就构成函数调用语句。例如:如

12、果函数没有返回值,则只能使用函数语句的方式调用,而有返回值的函数允许使用函数语句的方式调用,只不过函数的返回值被舍弃不用了。printfprintf(area=%lf,(area=%lf,s s););22224.3.1 4.3.1 函数声明和函数原型函数声明和函数原型(3)函数实参函数可以作为另一个函数调用的实参出现。这种情况是把该函数的返回值作为实参进行传递,因此要求该函数必须是有返回值的。例如:即是把max调用的返回值又作为printf函数的实参来使用的。printfprintf(%d,(%d,maxmax(x x,y y););23234.3.1 4.3.1 函数声明和函数原型函数声明

13、和函数原型假设max(x,y)返回两个数的最大值,则:返回四个数的最大值。maxmax(maxmax(a a,b b),),maxmax(c c,d d)24244.3.1 4.3.1 函数声明和函数原型函数声明和函数原型前面述及,函数调用时实参的运算是有方向的,即函数调用对实参的计算是有求值顺序的。运算方向由不同的函数调用约定决定。C语言默认使用C调用约定,求值顺序是自右向左。与此相反的是PASCAL调用约定,求值顺序是自左向右。C程序需要经过特别的设定才能是PASCAL调用约定。25254.3.1 4.3.1 函数声明和函数原型函数声明和函数原型例如:程序输出结果为:8,5,3。因为在调用

14、printf函数时,先处理最右边的i=i+j,这个实参值是3,再处理中间的j=j+i,这个实参值是5,最后处理左边的i=i+j,这个实参值是8。intint i i=1 1,j j=2 2;printfprintf(%d,%d,%d(%d,%d,%dnn,i i=i i+j j,j j=j j+i i,i i=i i+j j););/从右向左计算实参/从右向左计算实参26264.3.2 4.3.2 库函数的调用方法库函数的调用方法C语言拥有庞大的系统库函数可以使用,既有标准库函数完成基本功能,又有专业库函数实现特定功能。27274.3.2 4.3.2 库函数的调用方法库函数的调用方法图形库Op

15、enGLhttps:/www.opengl.org/28284.3.2 4.3.2 库函数的调用方法库函数的调用方法图形库DirectX29294.3.2 4.3.2 库函数的调用方法库函数的调用方法图形界面库wxWindowshttps:/www.wxwidgets.org/30304.3.2 4.3.2 库函数的调用方法库函数的调用方法图形界面库Qthttp:/www.qt.io/31314.3.2 4.3.2 库函数的调用方法库函数的调用方法多媒体库OpenALhttps:/www.openal.org/32324.3.2 4.3.2 库函数的调用方法库函数的调用方法游戏开发库OGREh

16、ttp:/www.ogre3d.org/33334.3.2 4.3.2 库函数的调用方法库函数的调用方法游戏开发库Allegrohttp:/liballeg.org/34344.3.2 4.3.2 库函数的调用方法库函数的调用方法网络开发库Winsock,数据库开发库ODBC API,科学计算函数库GSL等。同时多数应用软件,例如Office、MATLAB、AutoCAD等均提供了C语言接口,使C/C+通过混合编程用到这些软件的特色功能。35354.3.2 4.3.2 库函数的调用方法库函数的调用方法无论使用库函数或是混合编程,对于C/C+程序来说本质上就是在使用函数。这里给出库函数调用的一般

17、方法。36364.3.2 4.3.2 库函数的调用方法库函数的调用方法(1)在程序中添加库函数声明多数库函数将自己的函数原型和特殊数据等放在头文件(.h)中,所以应首先使用文件包含命令将这些头文件包含到程序中。例如欲使用数学库函数,文件包含命令为:#include#include 37374.3.2 4.3.2 库函数的调用方法库函数的调用方法从而使得程序有函数声明,例如:调用就能够通过编译。y y=sinsin(x x););/求x(弧度)的正弦/求x(弧度)的正弦38384.3.2 4.3.2 库函数的调用方法库函数的调用方法(2)将库函数目标代码连接到程序中。在连接时,例如使用了sin函数,就必须要有sin函数的实现代码才能生成可执行文件,否则连接出错。要将库函数的目标代码能够连接到程序中,主要是配置好开发环境的相关参数,然后由连接器处理。39394.3.2 4.3.2 库函数的调用方法库函数的调用方法标准库函数的连接在开发环境中是默认的,一般可以不用特别设置。经过上述两个步骤,可以让程序调用库函数了。但要让库函数发挥作用,实现期望的功能,还需要通过库函数详尽的使用手册了解:函数的作用、功能、调用参数要求等,例如sin函数要求调用参数是弧度值。函数的调用约定,确保正确地参数传递和函数返回。结束结束

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

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

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

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