1.函数的概念
函数的英文单词是function(起……作用)。单词function既可以是动词,也可以是名词。作为名词时,其意义为:功能,作用,应变量,函数,职务,重大聚会;作为动词时,其意义为:有作用,起作用,行使职责。显然,在程序设计过程中,函数既有名词的意义,也有动词的意义。通常在程序中用函数来表示子例程。
C/C++的源程序是由函数组成的。读者在学习C语言阶段,对函数已有了一定程度的理解。本节复习函数的概念,以帮助读者打下学习模板库的基础。
C/C++程序中至少需要(必须)一个main()函数。程序通常由多个函数组成的。函数是C++源程序的基本模块。通过调用相应的函数可实现特定的功能。
从函数定义的角度划分,函数可分为库函数和用户自定义函数两种。C/C++语言提供了强大的、极为丰富的库函数。库函数使用时只需包含相应的头文件即可直接调用。用户自定义函数是按用户需求编写的函数。用户或程序开发者也可以把自己的思想或算法编写成一个个相对独立的函数模块。在使用时,不但要在程序中定义函数本身,而且要在main()函数模块中进行函数类型说明。
函数还可以分为有返回值函数和无返回值函数。有返回值函数被调用后将向调用者返回一个执行结果(函数返回值)。有返回值的函数必须在函数声明和定义中明确函数返回值的类型。无返回值函数用于完成某项特定的处理任务,执行完成后不必向调用者返回函数值。在定义此类型函数时,函数返回值的类型为void。
函数还可以具有参数。从这个角度划分,函数可以分为无参函数和有参函数。无参函数是指函数定义、函数声明及函数调用过程中均不包含参数;有参函数是指在函数定义及函数声明时均包含参数。有参函数的参数通常称为形式参数。函数调用时必须给出参数(实际参数)。函数调用时,主函数会把实际参数的值传送给形式参数,供被调用的函数使用。
对于函数的声明和定义,举例说明如下:
2.函数的调用
函数是如何被调用的呢?
C语言中,函数调用的一般形式为:
参数表中的参数可以是常数、变量、其他类型的数据以及表达式。各参数之间用逗号分隔。
若函数没有参数,则调用时不用填写参数表。形式如下:
说明:函数定义时填写的参数表是形式参数,简称形参;函数被调用时,填入的参数是实际参数,简称实参。
函数被调用时,将实际参数传递给形参表可以有两种形式:①赋值调用;②引用调用。赋值调用是将各个参数的值传递给函数的形参表。此时函数中形参的值发生变化,不会影响函数调用时使用的变量(实际参数)。引用调用是将实际参数的地址复制给形式参数。当函数调用时,这个地址用来访问所使用的实际参数。这意味着在函数调用过程中,形参的数值变化会直接反映到实际参数的值。下面举例说明这两种调用形式的区别。
提示
例1-7中包含两个自定义函数pow2(floatx)和pow3(float∗y),函数pow2()是赋值调用形式;函数pow3()是引用调用形式,但在函数pow3()中参数y并没有发生变化,因此在输出变量B时,B的值没有变化。
例1-7
上述代码的执行效果如图1-5所示。
图1-5 例1-7的执行效果
总结
本小节主要学习如何使用函数,如何调用函数,理解函数的形参和实参,理解被调用函数的返回值。
3.函数的递归调用形式
函数可以实现自我调用。若在函数内部调用了函数自身,则称这个函数为“递归”。例如,计算阶乘的函数代码即是使用了递归形式。3的阶乘等于1×2×3,即6。一般计算阶乘的代码如例1-8所示:
例1-8
例1-8的执行效果如图1-6所示。
(www.xing528.com)
图1-6 例1-8的执行效果
总结
在实现函数的递归调用形式时,最关键的是将“递归结束条件”放在递归调用的前面,并且“递归结束条件”一定要书写正确,否则会带来不必要的麻烦。
4.函数的通用性和效率
函数的通用性一般用来指某些通用性较强的函数,通用函数可被许多程序员使用,并且通用函数需要的变量和数据必须用函数参数的形式传递。使用参数传递数据,除有助于函数可用在多种情况下外,还可提高函数代码的可读性。
C语言是基于函数的语言,故函数是必不可少的。但函数调用的效率较低,对于特别简单的功能模块,或程序对执行速度要求较高时,可考虑使用内嵌代码的形式。如例1-9所示:
例1-9
例1-9中,代码语句for(x=1;x<11;++x)printf(“%d”,x∗x)可以单独编写成一个函数,但是函数调用的效率较低,此处体现了内嵌代码的优越性。
5.函数中的变量
1)局部变量和全局变量
局部变量也称为内部变量,它是在函数内实现定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。
全局变量也称为外部变量,它是在函数外部定义的变量。全局变量不属于哪一个函数,而属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应进行全局变量说明。全局变量的说明符号为extern。但在某函数之前定义的全局变量,在该函数内使用可不再加以说明。
2)变量的存储类别
使用函数会涉及不同的存储方式:静态存储方式;动态存储方式。全局变量使用静态存储方式;函数的形参和普通局部变量使用动态存储方式。
在函数中还可以声明或定义4种类型的变量。这4种类型分别是auto,static,register和extern。
•auto类型是默认类型,可以省略不写。
•static类型属于静态存储类型,当希望函数中局部变量的值在函数调用结束后不消失并保留原值时,此时可用关键字static声明该局部变量。
•C/C++语言允许将局部变量的值放在CPU的寄存器中,这种变量叫做“寄存器变量”,用关键字register进行声明。
•如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件末尾。若函数需要引用该外部变量,则应该在引用之前用关键字extern对该变量进行“外部变量声明”,表示该变量是一个已经定义的外部变量。有此声明,即可从“声明”处起合法地使用该外部变量。
下面举例说明4种变量的存储类别。
首先定义一个文件my.cpp,在文件中添加以下代码:
创建例1-10的源文件如下:
例1-10
将my.cpp文件和ex10.cpp放在一起,或者将my.cpp文件加入到ex10.cpp所属工程中。例1-10中包含了4种变量的存储类型,虽然没有给出各种变量的详细说明,但最重要的是给出了外部变量的使用方法。例1-10的执行效果如图1-7所示。
图1-7 例1-10的执行效果
总结
在阅读此小节时,读者要认真体会函数中各种变量的使用方法。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。