C语言从头学21——函数

函数是一段可以重复执行的代码。这个定义比较抽象,实际上就是我们常说的子程序。函数的来源有两大块,一是C语言为我们提供的大量函数,如 printf(),它们被声明在各种头文件、库文件中,使用前我们使用 #include 命令把相应的文件包含到我们的程序中就可以使用;另一块是我们自己编写 (自定义) 的函数,本文重点学习这一块内容。

我们要使用自定义的函数,前提是已经完成了这个函数的编写。我们编写函数的位置应在main()函数之前,也可以在 main() 函数前只完成函数的声明。函数内容可在其他地方实现。一个函数一般由返回值类型、函数名、参数和函数体构成。

1、返回值类型

所谓返回值类型就是运行完这个函数它返回一个什么类型的值,也可以看做是这个函数的类型。比如,具有整数加法功能的函数它的返回值类型是 int 型;具有浮点数加法功能的函数它的返回值是 float 类型。当然,有时运行一个函数只是让它完成一些操作,不需要返回什么,这种无返回值的函数我们也给它一个类型 void;也就是说函数前面不能空着,总得写上点什么。

返回值的之所以能够返回,需要有专门语句配合,凡有返回值的函数都有一条 return xxx; 语句将返回值返到函数外边。没有返回值的函数这条return语句可以省略,也可以只写一个return,表示无值可返。

2、函数名

函数名称的命名规则可以参照前文曾介绍的变量的命名规则,函数名后边加上一对括号"()"是函数的标配。也可以这样理解,有名字后边跟着括号无论括号是否空着我们都可以把它看成函数。( 特例是有参宏,不过看成函数也无所谓,根本上说有参宏也是重复使用的代码)

3、参数

函数要完成一些功能,有时需要外部传入一些值进去,这些值称为参数。参数写在函数名后边的括号中,参数前面需要写上参数是什么类型;这里的参数由于还没有确定的值,也不是确定的变量,所以也称为形参。参数可以是1个,也可以是多个,当然也可以没有。没有参数的函数括号内写上 void 或者干脆空着。

4、函数体

函数体是函数具体功能的实现部分,这部分内容要用一对大括号括起来,标志着函数结尾的最后一个 "}" 后边无需写 ";" ,写了也不报错。在前面的文章中曾提到语句块的概念,语句块也是用大括号括起来,这个不冲突。只有最外边的一对大括号括起来的内容加上自身才能成为函数体。函数体内可以有许多对大括号,各自完成各自的功能,但一定要成对出现。

举个例子:

cpp 复制代码
   int myPlus(int x1,int x2) //返回值类型int,函数名myPlus,参数x1 x2(参数的类型也要写上)
   {
      return x1+x2; //返回值语句;将x1+x2的和return到函数外边
   }

再举个例子:

cpp 复制代码
   void myPrint(void) //无返回值,无参数,函数名myPrint
   {
      printf("%d",12+13); //仅显示12+13的和,不返回什么,省略了return
    }

5、函数的声明

我们把前面举的两个例子,原样放到一个C语言程序 main() 函数前面(即源码文件的顶层),就完成了这两个函数的声明并同时完成了两个函数的实现(实现就是把函数体代码写好)。

也可以把函数的声明与函数的实现分开来写。比如:在main() 函数前面只写上"int myPlus(int x1,int x2);",如此就算完成了myPlus的声明;至于实现,可以放到程序的其它位置,靠前靠后都可以。但无论怎样,函数的声明与实现都不能写到其它函数的内部,包括不能写到main函数内部。

6、函数的调用

函数的调用就是使用一个函数完成一定的操作,再强调一下,使用一个函数必须保证这个函数已经声明并完成了实现。调用一个函数的位置没有要求,在哪都可以调用,在其它函数中或者main函数中都可调用。

调用有参函数时,传入参数的个数、类型要与原声明的参数一致,这里写参数时,参数一般是确定的值或者是已经声明并赋值的变量,所以这里就不需要写参数类型了,写了会报错。有返回值的函数可以先定义一个类型一致的变量来接收返回值,当然直接使用有返回值的函数对返回值不予接收也是可以的(有些C语言内置函数不接受返回值会报警,但不影响运行)。

一个函数只能有一个返回值。如果想返回多个值,可以返回一个数组的首地址指针,然后用指针按图索骥,找到其它值。或者在函数内部操作全局变量、指针都可以影响到函数外部,不一定必须从返回值得到结果。

函数调用的特例:递归调用,即函数中自己调用自己;这种调用方式内部必须有一个在特定条件下结束的机制,否则会陷入死循环。典型的递归调用程序是计算阶乘,关于计算阶乘的小程序本人曾经发表过,有兴趣可以在我的博文中找找。

再举一个完整的关于函数的例子:

cpp 复制代码
float mySum(float a1,float a2,float a3) //返回值float三个参数也是float(参数与返回值类型可以不一致)
{
    return a1 + a2 + a3; //返回三个参数的合计
}
#include<stdio.h>
int main(void)
{
    float x=mySum(1.23,4.56,7.89); //调用mySum函数传入3个参数并用x接收返回值
    printf("%f", x); //将x显示到屏幕
    getchar(); //阻塞程序运行
    return 0;
}
相关推荐
ö Constancy10 分钟前
Linux 使用gdb调试core文件
linux·c语言·vim
lb363636363611 分钟前
介绍一下strncmp(c基础)
c语言·知识点
wellnw16 分钟前
[linux] linux c实现共享内存读写操作
linux·c语言
珹洺3 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
.Cnn4 小时前
用邻接矩阵实现图的深度优先遍历
c语言·数据结构·算法·深度优先·图论
2401_858286114 小时前
101.【C语言】数据结构之二叉树的堆实现(顺序结构) 下
c语言·开发语言·数据结构·算法·
寻找码源5 小时前
【头歌实训:利用kmp算法求子串在主串中不重叠出现的次数】
c语言·数据结构·算法·字符串·kmp
带多刺的玫瑰6 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
陌小呆^O^7 小时前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp
时光の尘7 小时前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c