今天和大家聊聊C语言中的函数。 很多人可能对他们不太了解。 为了让大家更加了解,小编为大家总结了以下内容。 希望您能从本文中有所收获。
函数定义
函数是用户和程序之间的接口。 在定义函数之前,必须明确以下三个问题。
1)函数的功能实现和算法选择。 算法选择将在后续文章中详细讲解。 本节重点介绍函数的功能实现。 一般选择一个能够体现函数功能的函数名,并且名字要耳熟能详。 例如,求和函数的函数名称可以取为add,最大值的函数名称可以取为max,排序函数可以取为sort。
2)用户需要向函数传递哪些参数和类型,即函数参数。
3)函数执行后返回给调用者的参数和类型,即函数返回值类型。
函数定义格式
函数定义的一般格式为:
返回类型函数名(类型参数1,类型参数2,...)
{
函数体
}
例如,定义一个对两个整数求和并返回总和的函数。 其功能实现代码为:
int add (int x,int y){ (x+y) ; //括号可以省略}
阐明:
1)函数定义由两部分组成:函数头和函数体。 函数名、参数列表和返回类型三部分一般称为函数头。 一对花括号 {} 将函数体括起来。
2)函数名称:符合标识符的命名规则,名称最好看得清楚。 例如,使用add作为求和函数的函数名,使用sort作为排序函数名。
3)参数表:函数定义中的参数也称为形式参数,简称形式参数。 它可以包含一个或多个参数,多个形参之间用逗号分隔。 以下格式是错误的。
int add (int x;int y) //错误。 函数参数之间用逗号分隔,而不是分号 { x+y;}
每个形参对应的类型不能省略,下面的格式也是错误的。
int add (int x,y) //错误。 形参y的类型不能省略{x+y;}
它也可以不包含任何参数。 当没有参数时,参数表中关键字void可以写也可以省略。 为了规范起见,教程中对于无参数的函数,参数表中统一写为void。 例如:
输入函数名()
{
函数体
}
相当于:
type 函数名 (void) //建议写法{函数体}
4)函数定义中,参数列表后面不能加分号,下面的函数定义格式是错误的。
浮动添加(浮动x,浮动y); //错误。 定义函数时,函数头后面不能有分号{x+y;}
5)函数体:即函数的函数实现代码部分。 用一对大括号{}包围,函数体也可以为空,即函数体不包含任何代码,方便以后扩展。 例如:
无效乐趣 (){}
6)返回类型:也称为函数类型,即向调用者返回值的类型。 需要明确指定返回类型。 可以是int、char、float等基本数据类型,也可以是数组类型、指针类型、自定义类型(结构体类型)等复合数据类型。
如果省略返回类型,一般默认为int类型,但不推荐这种不规则的写法。
如果函数没有返回类型,则它的类型为 void。 例如:
void add(int x,int y){ ("sum=%d\n", x+y);}
除void类型外,在函数体中,需要显式地使用语句返回对应表达式的值。
函数返回值
函数的值是指执行函数体并在调用函数结束时返回给调用函数所获得的值。 函数返回值的说明如下。
1)对于有返回值的函数,一般使用语句将其值返回给调用者。 其格式为:
表达;
或者
(表达);
例如:
int add(int a, int b){ (a + b); // 后跟一个表达式}
2) 一个函数可以包含一条或多条语句,但每次调用时只能执行其中一条。
例如,求整数绝对值的函数:
int f(int n) //包含多条语句,但每次调用只执行一条{ if (n >= 0) n; 否则-n; //或(-1 * n);}
3)对于没有返回值的函数,其返回类型一般显式指定为void类型。 如void(无效); 函数,其返回类型为void。
4)如果函数的返回类型没有显式指定,则默认为int类型,不推荐这种不规则的写法。 例如:
add (int a, int b) //省略返回类型,默认为int类型 { (a + b);}
5) 后一个表达式的类型要与函数的返回类型一致。 如果不是,则返回前表达式的类型会自动转换为函数类型。 例如:
int f (void) //函数的返回类型为int{ int n = 1; (n+2.3); //表达式为类型}
上面函数中,函数类型为int类型,而后面表达式的类型为类型值3.3,两者类型不一致,所以先将表达式的类型自动转换为int类型值3,然后3 作为函数返回值返回给调用者。 在这种情况下,精度通常会丢失,并且可能无法获得预期的结果。
函电通话格式
无参数函数的调用格式
函数名();
注意:调用不带参数的函数时,参数列表为空,不能写void。 以下函数调用是错误的。
函数名(void);//错误! 调用无参函数时,参数列表为空,不能添加void
例如,如果有一个定义的无参函数 void (void); 调用如下。
( ) ; //正确的。 调用不带参数的函数(void); //错误。 实参表中不能添加void
带参数调用函数的格式
函数名(参数1,参数2,...);
阐明:
1)每个实参可以是各种类型的常量、变量或表达式。 例如,以参数调用定义的函数 int add(int a, int b); 如下。
加(2,5+1); //正确,实参可以是常量、变量或者表达式 int n=7;add(3,n); //正确,实际参数可以是变量
2)调用函数时,不能写函数类型。
int add(2,3);//错误,调用时无法添加返回类型
函电来电流程
函数调用的过程是:首先实参将初始值赋给形参,然后函数体对形参进行相应的处理,最后将处理结果作为函数值返回给调用者。
当函数没有被调用时,形参不占用内存空间。 函数调用时,为形参变量分配空间,将实参的值赋给形参变量对应的空间。 当函数调用结束时,分配给形参的空间被回收。 内存空间。 即形参只在函数调用过程中占用内存空间。
函数调用过程通过下面的add函数来说明。
//函数定义 int add(int a, int b) int s; s=a+b; s;}
阐明:
1)上面是add函数的定义,a和b是形参,s是函数中定义的变量,a、b、s这三个变量都是局部变量,作用域是函数,不能在 add 函数之外使用。
2)当不调用add函数时,a、b、s不占用内存空间。 调用该函数时,将执行以下语句。
int x=2, y=3, 总和; 总和=加(x,y);
函数调用语句中,有两个实参,第一个实参为x,值为2,第二个实参为y,值为3。函数调用时,为函数中形参a、b和变量s的三个整型局部变量,在VC++6.0中各占4个字节。
函数调用过程也是通过实参给形参赋初值的过程,即:
a=x;b=y;
在函数体内,将形参a和b求和的结果赋给s,最后将s的值作为函数的值返回给sum变量。 当调用进程结束时,函数add中所有局部变量的内存空间都被回收。
由于形参只在定义的函数内部有效,所以当调用函数时,函数的实参可以与形参变量同名,而不会互相影响。