图5.7两层函数嵌套调用示意图函数的嵌套调用即一个函数在被调用的过程中又调用了另外的一个函数。函数fac和powers的返回值类型均被设计为double型,其主要目的是为了避免n!x:0.5//0.5从键盘输入的数据0.50 powers of e=1.648721//程序执行结果......
2023-11-20
1.函数的定义
在C程序中,函数对应于某一特定功能,函数的定义就是编写实现这一功能的程序代码。C语言中函数定义的一般形式如下:
返回值类型名 函数名(类型名形参,类型名形参,…)
{
<函数体语句>
}
函数定义的形式中,最上面一行称为函数头(或函数首部),由函数返回值类型、函数名和形式参数表组成。它们的意义是:
①返回值类型名。任何一个非void类型的函数执行完成后都会得到一个具体数据,返回值类型名规定了这个返回数据的数据类型。函数执行后不需要返回值时,其类型应定义为void。C语言规定,定义返回值类型为int或char的函数时,返回值类型名可省略不写。
②函数名。用户为函数取的名字,程序中通过函数名来调用函数。除主函数main外,其他由用户自己用标识符进行命名。
③形式参数表。形式参数表示函数与外界打交道的数据通道,由零个到多个的形式参数组成,每个形式参数都由数据类型名和变量名两部分构成,参数之间用逗号分隔。一个函数即使没有形式参数,圆括号也不能省略。当函数被调用时,形式参数表中的参数从对应的实参获取数据。
C函数体由一对花括号括住,是函数实现具体功能的代码段,由零到若干条C语句构成。若函数是非void类型,函数体中必然存在返回语句。返回语句表达两方面含义:一是结束函数的调用(函数的执行);二是向调用者报告函数执行的结果。返回语句的形式为:
return 表达式;值得注意的是,一个函数执行结果的数据类型不是由返回语句中表达式数据类型决定的,而是取决于函数头中指定的返回值类型。两者不一致时,返回语句中表达式值被自动转换为函数头部指定的数据类型。
如果函数是void类型,函数体中可以没有返回的语句,此时函数体的右边花括号作为函数执行结束标志;也可以根据需要在函数体中使用仅由return构成的返回语句。例如,求某个整数阶乘的功能,可以定义如下C函数予以实现:
在函数体中可以存在多个返回语句用以表示函数执行结束的不同情况。例如,下面代码段表示了具有两种执行结束可能的函数:
//求两数之积或两数之和的函数定义
定义一个函数一般分为设计函数头和设计函数体两个步骤。设计函数头时,首先应该给函数取一个有意义的名字;其次可以把函数体想象成一个具有输入/输出的黑匣子,具体的功能实现被这个黑匣子隐藏起来,函数执行时需要从外界(函数的调用者)获取数据,根据这些数据的个数、次序、数据类型可以设计出对应的形式参数表;最后,根据函数执行后获得结果数据的类型来确定返回值类型。当一个函数所有的功能都在函数体内实现,不需要返回值时,返回值类型应定义为void。
在函数体的设计中,把形参当作已经初始化的变量直接使用,根据需要适当增加变量。对于函数体中求出的结果,一般不是直接输出,而是通过return语句返回给主调函数。(www.chuimin.cn)
例如,编写求两个正整数的最大公约数的函数。函数执行时的输入显然是两个正整数,说明形参是两个整型变量(假定用变量m和n表示);函数执行后的输出是整数表示的最大公约数,由此确定函数的返回值是整型;函数取名为gcd。函数定义如下:
/*求两个正整数最大公约数*/
C语言中规定,在一个函数的内部不能定义其他函数(即函数不能嵌套定义)。这个规定保证了每个函数都是一个相对独立的程序模块。在由多个函数组成的C程序中,各个函数的定义是并列的,并且在程序中的前后排列顺序也是任意的,函数在程序中前后排列的顺序与程序运行时函数的执行顺序没有任何关系。
2.函数的声明
C语言规定,程序中使用到的任何数据对象都要事先进行声明。对于函数而言,所谓“声明”是指向编译系统提供被调函数的必要信息:函数名,函数的返回值的类型,函数参数的个数、类型及排列次序,以便编译系统对函数的调用进行检查。例如,检查形参与实参类型是否一致,使用调用方式是否正确,等等。
标准库函数说明按类别集中在一些称为“头文件”的文本文件中,程序中要调用标准库函数时,只需要在程序的适当位置写上相应的文件包含预处理语句:#include<头文件名>或#include"头文件名",即可完成对标准库函数的声明。例如,程序中要调用输入输出标准库函数,使用的文件包含预处理语句是:
#include<stdio.h>或#inlcude"stdio.h"
声明自定义函数时,需要向编译系统提供函数的返回值类型、函数名和形式参数表的特征信息,声明语句的一般形式为:
返回值类型名函数名(类型名[形参],类型名[形参],…);
从函数声明的形式可以看出,函数声明就是描述出函数定义的头部信息。声明中描述函数形式参数表时,其中的参数个数、每个参数的类型、参数出现的次序都是非常重要的,但参数的名字是无关紧要的。例如,声明前面设计的gcd函数时,可以使用如下三种形式:
int gcd(int m,int n);//与函数头部书写完全一致,推荐初学者使用这种形式
【例5.1】 函数声明示例。
函数声明的语句既可以书写在某个函数体的内部,也可以书写在函数定义的外面。书写在特定函数内部时,用于向该函数声明被调用函数的特征,此时仅有书写了函数声明语句的函数知道被声明函数的存在。例如:例5.1使用的方法,就只有主函数知道函数gcd的特征,才能对gcd函数进行调用。当对被调函数的声明语句书写在函数定义的外面时,用于向该函数之后的所有函数声明被调函数的特征,即声明语句之后的所有函数都知道被调函数的特征,都可以对其进行调用。
当被调函数与主调函数位于同一源文件,且被调函数的定义出现在主调函数之前时,不必对被调函数进行声明,其原因是编译系统此时已经知道了被调函数的所有特征。
【例5.2】 对被调函数不必进行声明的示例。
有关C语言程序设计基础(第3版)的文章
图5.7两层函数嵌套调用示意图函数的嵌套调用即一个函数在被调用的过程中又调用了另外的一个函数。函数fac和powers的返回值类型均被设计为double型,其主要目的是为了避免n!x:0.5//0.5从键盘输入的数据0.50 powers of e=1.648721//程序执行结果......
2023-11-20
声明函数模板的一般格式如下:template<模板参数表>函数返回值类型函数模板名(形参表)函数模板定义由关键字template开头,表示声明一个模板。模板参数表写在尖括号<>中,参数一般由关键字class或typename后加一个标识符构成。Class和typename的意义相同,表示后面的标识符是一个参数类型,代表一个潜在的标准类型或用户定义的类型。例如,定义max函数模板求两个数中的较大者。如下面的声明是错误的:可以看出,用函数模板比函数重载更方便,程序更简洁。......
2023-11-07
包括函数名的命名和类型说明、形式参数的类型说明、变量定义和语句。下面举例说明主函数和自定义函数。函数的定义是平行的,彼此相互独立,不能嵌套定义。函数的类型和函数返回值的类型应保持一致。以两个数求和为例,说明函数的定义。......
2023-10-21
图8.1函数内存映射方式1.指向函数指针变量的定义C语言中可以定义指针变量来存储函数的首地址,并利用该指针变量对函数进行调用。指向函数的指针变量的真正作用是作为函数参数使用,使程序在功能的实现上具有更大的灵活性。指向函数的指针变量求最大值、最小值和两数之和。......
2023-11-20
一个函数直接或间接地调用自己,称为函数的递归调用。所以函数递归调用的实现必须依靠系统提供一个特殊部件(堆栈)存放未完成的操作,以保证当递归调用结束回溯时不会丢失任何应该执行而没有执行的操作。为了理解函数递归调用的特性,参照例5.9的程序讨论函数递归调用的执行过程,为了讨论方便为程序加上行号。函数递归调用示例。......
2023-11-20
还可以在枚举类型定义中对枚举元素起始值作多次改变,每次改变后枚举值从该处开始递增直到遇到下一次起始值的指定为止。枚举数据类型定义完成后,仍然需要定义枚举变量才能使用,常见的方法有:①先定义枚举类型,然后定义枚举变量。枚举变量的输入输出示例。......
2023-11-20
一般来说,对于一个n(n>1)级指针变量其内容是存放一个n-1级指针变量的地址。虽然y和z都是指针变量,但它们指向的变量是不同的,显然不能用同一层次的指针变量来表示。图8.5多级指针在存储系统中的关系在C语言中,用指针变量的级别来区分不同层次的指针变量。指向普通变量的称为一级指针变量,指向一级指针变量的称为二级指针变量,以此类推。而且,只要数据类型相同,任意级别的指针变量可以与普通变量、数组等一起定义。......
2023-11-20
声明虚函数的一般格式如下:virtual函数类型函数名(参数表)其中,用关键词virtual声明的函数称为虚函数。如果一个成员函数被声明为虚函数,这就意味着该成员函数在派生类中可能有不同的实现。动态绑定只能通过指针或引用标识对象来调用虚函数。......
2023-11-07
相关推荐