自定义函数

自定义函数函数的定义 函数定义的语法形式 数据类型 函数名(形式参数表){ 函数体 //执行语句 } 注意 函数的数据类型是函数的返回值类型(若数据类型为 void ,则无返回值)。 函数名是标识符,一个程序中除了主函数名必须为main外,其余函数的名字按照标识符的取名规则可以任意选取,最好取有助于记忆的名字

自定义函数"

函数的定义

函数定义的语法形式

数据类型  函数名(形式参数表){

函数体           //执行语句

}

注意

函数的数据类型是函数的返回值类型(若数据类型为 void ,则无返回值)。

函数名是标识符,一个程序中除了主函数名必须为main外,其余函数的名字按照标识符的取名规则可以任意选取,最好取有助于记忆的名字。

形式参数(简称形参)表可以是空的(即无参函数);也可以有多个形参,形参间用逗号隔开,不管有无参数,函数名后的圆括号都必须有。形参必须有类型说明,形参可以是变量名、数组名或指针名,它的作用是实现主调函数与被调函数之间的关系。

函数中最外层一对花括号“{ }”括起来的若干个说明语句和执行语句组成了一个函数的函数体。由函数体内的语句决定该函数功能。函数体实际上是一个复合语句,它可以没有任何类型说明,而只有语句,也可以两者都没有,即空函数。

函数不允许嵌套定义。在一个函数内定义另一个函数是非法的。但是允许嵌套使用。

函数在没有被调用的时候是静止的,此时的形参只是一个符号,它标志着在形参出现的位置应该有一个什么类型的数据。函数在被调用时才执行,也就是在被调用时才由主调函数将实际参数(简称实参)值赋予形参。这与数学中的函数概念相似,如数学函数:f(x)= x^2+x+1

这样的函数只有当自变量被赋值以后,才能计算出函数的值。

函数定义的例子

……

函数的形式

函数的形式从结构上说可以分为三种:无参函数、有参函数和空函数。它们的定义形式都相同。

无参函数

无参函数顾名思义即为没有参数传递的函数,无参函数一般不需要带回函数值,所以函数类型说明可以为void。

有参函数

有参函数即有参数传递的函数,一般需要带回函数值。

空函数

空函数即函数体只有一对花括号,花括号内没有任何语句的函数。例如,

函数名()

{             }

空函数不完成什么工作,只占据一个位置。在大型程序设计中,空函数用于扩充函数功能。

函数的声明和调用

函数的声明

调用函数之前先要声明函数原型。在主调函数中,或所有函数定义之前,按如下形式声明:

类型说明符  被调函数名(含类型说明的形参表);

如果是在所有函数定义之前声明了函数原型,那么该函数原型在本程序文件中任何地方都有效,也就是说在本程序文件中任何地方都可以依照该原型调用相应的函数。如果是在某个主调函数内部声明了被调用函数原型,那么该原型就只能在这个函数内部有效。

下面对js( )函数原型声明是合法的。

int jc(int n);

int jc(int);

可以看到函数原型声明与函数定义时的第一行类似,只多了一个分号,成为了一个声明语句而已。

函数的调用

声明了函数原型之后,便可以按如下形式调用函数:

函数名(实参列表)

实参列表中应给出与函数原型形参个数相同、类型相符的实参。在主调函数中的参数称为实参,实参一般应具有确定的值。实参可以是常量、表达式,也可以是已有确定值的变量,数组或指针名。函数调用可以作为一条语句,这时函数可以没有返回值。函数调用也可以出现在表达式中,这时就必须有一个明确的返回值。

函数的返回值

在组成函数体的各类语句中,值得注意的是返回语句  return。

它的一般形式是:

return(表达式);

其功能是把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数的返回。所以,在圆括号表达式的值实际上就是该函数的返回值。其返回值的类型即为它所在函数的函数类型。当一个函数没有返回值时,函数中可以没有return语句,直接利用函数体的右花括号“}”,作为没有返回值的函数的返回。

也可以有return语句,但return后没有表达式。返回语句的另一种形式是:

return;

这时函数没有返回值,而只把流程转向主调函数。

函数的传值传址调用

函数传值调用的特点是将调用函数的实参表中的实参值依次对应地传递给被调用函数的形参表中的形参。要求函数的实参与形参个数相等,并且类型相同。函数的调用过程实际上是对栈空间的操作过程,因为调用函数是使用栈空间来保存信息的。函数在返回时,如果有返回值,则将它保存在临时变量中。然后恢复主调函数的运行状态,释放被调用函数的栈空间,按其返回地址返回到调用函数。

传值调用

这种调用方式是将实参的数据值传递给形参,即将实参值拷贝一个副本存放在被调用函数的栈区中。在被调用函数中,形参值可以改变,但不影响主调函数的实参值。参数传递方向只是从实参到形参,简称单向值传递。举个例子:

#include<iostream>

using namespace std;

void swap(int a,int b)

{ int tmp=a;a=b;b=tmp; }

int main()

{

int c=1,d=2;

    swap(c,d);

    cout<<c<<' '<<d<<endl;

return 0;

}              

//程序输出为:1 2

在此例中,虽然在swap函数中交换了a,b的值,但是在main中却没有交换。因为swap函数只是交换c,d两变量副本的值,实参值没有改变,并没有达到交换的目的。

传址调用

这种调用方式是将实参变量的地址值传递给形参,这时形参是指针,即让形参的指针指向实参地址,这里不再是将实参拷贝一个副本给形参,而是让形参直接指向实参,这就提供了一种可以改变实参变量的值的方法。现在用传址调用来实现swap:

#include<iostream>

using namespace std;

void swap(int &a,int &b)  //定义swap()函数,形参是传址调用

{int tmp=a;a=b;b=tmp; }

int main()

{

int c=1,d=2;

swap(c,d);           //交换变量

    cout<<c<<' '<<d<<endl;

return 0;

}              

//程序输出为:2 1

在此例中,因为swap函数的参数为传址调用,&a是指实参变量的地址值传递给形参,所以,在函数swap中修改a,b的值相当于在主函数main中修改c,d的值。

全局变量、局部变量及它们的作用域

在函数外部定义的变量称为外部变量或全局变量,在函数内部定义的变量称为内部变量或局部变量。

全局变量

全局变量的作用域是从变量定义的位置起直至本源文件结束止,即从定义位置之后的所有函数都可以访问该全局变量。

注意

在一个函数内部,既可以使用本函数定义的局部变量,也可以使用在此函数前定义的全局变量。

全局变量的作用是使得函数间多了一种传递信息的方式。如果在一个程序中多个函数都要对同一个变量进行处理,即共享,就可以将这个变量定义成全局变量,使用非常方便,但副作用也不可低估。

过多地使用全局变量,会增加调试难度。因为多个函数都能改变全局变量的值,不易判断某个时刻全局变量的值。

过多地使用全局变量,会降低程序的通用性。如果将一个函数移植到另一个程序中,需要将全局变量一起移植过去,同时还有可能出现重名问题。

全局变量在程序执行的全过程中一直占用内存单元。

全局变量在定义时若没有赋初值,其默认值为0。

局部变量

局部变量的作用域是在定义该变量的函数内部。换句话说,局部变量只在定义它的函数内有效。在一个子程序内定义的变量也是局部变量,其作用域是该子程序。函数的形参也是局部变量。

由于局部变量的作用域仅局限于本函数内部,所以,在不同的函数中变量名可以相同,它们分别代表不同的对象,在内存中占据不同的内存单元,互不干扰。

一个局部变量和一个全局变量是可以重名的,在相同的作用域内局部变量有效时全局变量无效。即局部变量可以屏蔽全局变量。

这里需要强调的是,主函数main中定义的变量也是局部变量,这一点与其他程序设计语言不同。

全局变量数组初始全部为0,局部变量值是随机的,要初始化初值,局部变量受栈空间大小限制,大数组需要注意。通俗说,局部变量的数组不能开很大,全局变量随便。

并非原创,仅是整理,请见谅。

今天的文章自定义函数分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/55990.html

(0)
编程小号编程小号
上一篇 2023-08-27
下一篇 2023-08-27

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注