C语言绝对值得一看的常识讲解:函数篇

利用计算机解决问题的常用方法是,首先把比较复杂的问题分解为若干个相对简单的子问题;然后分别求解。如果某个子问题已经有了解决方案,就直接使用这一“预制件”来解决该问题;否则,需要设计新的“预制件”。“预制件”可用于解决某个子问题,也可以用于解决包含相同子问题的其他问题。在程序设计中,这种方法称为“模块化”的程序设计方法。

C语言程序中的“预制件”,也称为一个,模块。函数是实现模块化程序设计的重要机制。

这篇文章主要介绍函数的定义、函数的值和函数的调用等内容。

目录

1.函数的定义

1.1函数头部

1.2函数体

2.函数的值

2.1返回语句

2.2函数功能

3.函数的调用

3.1有参函数的调用

3.2无参函数的调用

3.3函数调用的方式

4.函数的声明与函数的原型


1.函数的定义

程序设计语言中函数的概念来源于数学中的函数。在数学中可以定义函数,例如:定义⼀次函数 y=kx+b,其中x是自变量,函数y的值取决于x的值是多少。在C语言中,也是先定义函数……类似于数学中的函数定义,然后再调用该函数……类似于数学中计算某个函数的某个特定值。

函数是C语言程序的基本组成成分。编写程序的主要工作,实际上就是编写各个函数。根据不同的需要,在之前文章中已经定义若干个main函数。

一个函数的定义包括两部分,即函数头部的定义和函数体的定义。

1.1函数头部

定义函数头部的一般形式为:

数据类型 函数名 (形参列表)

其中,数据类型规定了函数的返回值类型;函数名是一个合格的标识符;形参形参列表是由逗号分隔的变量声明。函数头部的形参列表可以为空,即形参列表不包括任何参数,此类函数称为无参函数。函数头部的形参列表也可以包括一个或多个参数,此类函数称为有参函数。

参数列表的一般形式为:

数据类型 参数名,数据类型 参数名,数据类型 参数名,…,数据类型 参数名

为了节省存储空间,编译器在定义函数时通常不为函数分配存储空间,在函数调用时才进行内存分配。(和那些我们自定义的数据类型同理)

在函数头部部分,分别定义了函数的类型、函数的名字、形参列表。该部分定义的是函数的基本特征,是用函数使用者(包括函数定义者)必须遵循的标准,也称为“接口”。其中:函数的数据类型指的是函数该函数计算结果的数据类型,也就是函数返回值的数据类型。而函数返回值的数据类型,可以是任意一种数据类型(例如int、float等),也可以是空类型“void”。

注意:

①定义无参函数时,函数名后面的圆括号不能省略。

②定义有参函数时,如果包括多个参数,参数之间必须用逗号一一分隔。对每一个参数都必须单独定义其数据类型(即参数的类型相同时也不例外)。换句话说就要对每一个参数进行类型说明,然后参数之间用逗号分隔。

int max ( int x , y )//没有定义函数y的数据类型

int max ( int x; int y )//各个参数之间,不能用分号分隔,而只能使用逗号分隔
1.2函数体

定义函数体的一般形式为:

{

        变量的定义和声明

        语句序列

}

函数体是函数功能的具体实现过程,相当于一个具有特定功能的复合语句。一般包括变量的定义、声明部分和语句序列部分。

double perimeter ( double radius )
{
    /*变量的定义和声明部分*/
    int num1,num = 4;
    char ch = 'A';
    double num3 ;
    …
    /*语句序列部分*/
    num = 3 * num2 ;
    …
}

 函数体中的变量只能在本函数的内部使用,称为该函数的“局部变量”。参数列表中定义的变量用于接收实际参数的值,也只能在该函数内部使用。因此形式函数也属于局部变量。

注意:

C语言要求函数体中变量的定义和说明(包括变量的初始化部分),必须放在各语句之前。

2.函数的值
2.1返回语句

返回语句的一般形式为:

return 表达式;

返回值的功能:首先计算表达式,然后结束所在函数的执行。当所属函数返回值的数据类型非空类型时,返回语句还可以将表达式的值作为本次函数调用的返回值,返回给函数的使用者。

2.2函数功能

按照函数的不同功能,可以将C语言的函数分为两类:一类函数用于计算一个值,称为具有返回值的函数;一类函数仅仅是为了实现一个过程而不是为了得到一个值,称为无返回值的函数。

在C语言程序中,每一个运算对象都有数据类型,函数的返回值也不例外。如果函数的功能仅仅是为了表示一个过程,不需要返回值,应该将函数返回值的数据类型设置为空类型,即void类型。否则,定义函数时,应该定义函数返回值的数据类型。

注意:

①定义函数的头部时,如果不指明函数返回值的数据类型,编译器默认该函数返回值的数据类型是int型。

②有返回值的函数的计算结果,只通过返回语句才能向函数的使用者返回指定的计算结果。

a.有返回值的函数。函数的计算结果就是函数的返回值,这一结果通过return语句返回给调用者。如果没有使用return语句,或者控制流没有执行到return语句,则函数并非不返回值,而是返回一个不确定的值。(只要该函数有返回值,那么就算程序有漏洞没有返回,但是系统都会给它一个交代)

b.无返回值的函数。当函数的返回值类型定义为“void”时,表明函数没有返回值。无返回值的函数只能用作单独语句,而不能作为算术或赋值等运算符的操作数,进行相应的算术或赋值运算。

3.函数的调用

使用已经定义的函数的过程,称为函数的调用。

3.1有参函数的调用

类似于代数中对函数的使用,C语言中对有参函数的调用是为其形参代入指定的值,再由其完成既定计算的过程。

有参函数的调用的一般形式为:

函数名(形参列表);

 其中,参数列表的一般形式为:

表达式,表达式,表达式…,表达式

调用函数时,受限需要计算这些表达式的值,然后将这些值传递给形参。这些表达式称为实际参数,简称实参。

实参的个数必须与被调用函数的形参个数一样多。各个实参表达式的数据类型,也应该分别与调用函数形参的数据类型一致。当二者的数据类型不一致时,系统将自动进行数据类型的转换;实参将按照形参的数据类型参加运算。

3.2无参函数的调用

调用无参函数的一般形式为:

函数名( );

 在调用无参函数时,只需要使用函数名并在其后面加上一组圆括号即可。

有返回值函数的调用,是按值的形式出现在主调函数环境中的。在所有需要值的上下文环境中,这类函数的调用都可以出现。其值可以作为运算符的运算分量参加表达式计算,也可以出现在函数的实参列表中。

3.3函数调用的方式

函数的调用,会使程序的控制流程发生相应的改变。

主调函数是按顺序执行的。当执行一个函数调用时,它的控制流程会暂时中断,主调函数执行的现场会被保存起来,计算机的控制权由被调函数接管:首先构造被调函数的运行环境,把实参表达式的值传递给形式变量,然后开依次始执行被调函数函数体的各条语句,直到被调函数执行完毕。被调函数执行完毕后,恢复主调函数的现场并处理返回值。计算机的控制权重新有主调函数接管。

函数调用时,主调函数把实参表达式的值传递给被调函数的形参变量。C语言的参数传递机制是值的单向传递。函数调用时的处理过程如下:

①计算各个实参表达式的值。

②把这些值分别“赋值”给对应的形参变量。

③开始执行函数体。

4.函数的声明与函数的原型

C语言中,所有运算对象都必须“先定义后使用”,因为每个运算符的操作方法取决于它的类型。函数作为运算对象的一种,当然也必须遵循这一规定。

一个函数能够被调用,必须具备下列两个条件。

①被调用函数已经有定义。函数的定义是函数实体。它确定函数的功能,规定函数的实现细节。被调用的函数可以出现在任何位置,可以和主调函数在同一个源程序文件(在同一个源程序文件中时,可以出现在主调函数的前面或者后面),也可以在另外的文件中定义。函数的定义要保证链接时能够找到函数的实体,最终构造出可执行程序。

②被调用函数已经声明。C语言程序的基本编译单位是文件。编译主调函数所在的源文件时,在主调函数之前,必须能够让编译器看到被调用函数的特征。

a.实参个数和形参个数是否一致。

b.实参表达式的数据类型和形参是否一致。

c.函数返回值类型和主调函数环境是否相符,不符需要进行类型转换。

函数声明是函数特征的描述。它是一种告知,将函数的特征告知编译器,从而在编译阶段,对被调函数的合法性进行全面检查。

函数声明的一般形式为:

数据类型 函数名 (数据类型 参数名,数据类型 参数名,数据类型 参数名,…,数据类型 参数名);

或者

 数据类型 函数名 (参数名, 参数名, 参数名,…, 参数名);

第二种的参数列表不带形参名字,因为编译器只检查函数形参的个数和数据类型。但是函数的声明是函数的接口规范,调用者需要通过它了解函数的功能和特征。在函数声明中采用有意义的形参名字,可增加接口的可读性,有利于函数的正确使用。

注意:

 ①同一个函数的定义,只有一个。

②同一个函数的调用和声明可以有多处。(大家可以简记为“一次定义,多次使用”)

③被调用函数的定义,如果和主调函数在同一个源文件中,并且是在主调函数的前面定义的,被调用函数的声明可以省略。

函数的声明也称为函数的原型。函数的原型和函数的头部相似,在已经定义的函数的头部后面,再加上一个分号,即为函数的原型。

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值