前言:
hello,大家好呀,我是Humble
今天我们来聊一聊函数
这个东西其实我们在写第一个C程序就一直在用了
那么今天我们来稍微详细的介绍一下它
关于函数的概念,在数学中我们对此并不陌生,比如:一次函数 y=kx+b
而C语言也引入了函数(function)这个概念,函数还有一种翻译 :子程序 其实这种翻译更加的贴切这个概念
因为C语言中的函数就是一个完成某项特定的任务的一小段代码,这段代码有着特殊的写法和调用方法
在C语言中我们一般会见到两类函数:
1.库函数
2.自定义函数
下面我们先来看看库函数吧
一.库函数
我们前面内容中学到的 printf 、 scanf 都是库函数,这些函数已经是现成的,我们只要学会就能直接使用了
有了库函数,一些常见的功能就不需要程序员自己实现了,一定程度提升了效率;同时库函数的质量和执行效率上都更有保证
在我们编译器的标准库中提供了一系列的库函数,这些库函数根据功能的划分,都在不同的头文件中进行了声明
因此我们在调用库函数时,只要对其头文件进行声明便能使用啦
既然库函数有这么多,我们在哪可以学习它们呢?
其实这类查看工具有很多,这里给大家推荐一个叫 cplusplus.com的网站
这是网址:https://legacy.cplusplus.com/reference/clibrary/
注意,(插句题外话)虽然这是个英文界面的网站,但我们编程是肯定要跟英语打交道的,所以大家千万不要对它产生排斥心理。随着我们阅读的增加,我们看英文也会变得越来越轻松,欸,说不定四六级都因为这个通过了(笑)
说了这么多,接下来以 sqrt 这个函数来举例一下这个函数的用法
我们搜索到这个函数,映入我们眼帘的标题就是这个函数的名字
接下来则是正文
首先,我们看到的是这个我们要查看函数的原型
对于sqrt函数来说就是这个
然后下面就对函数功能进行介绍,对于sqrt函数来说就是这个
中文为 计算平方根,返回x的平方根
往下是参数和返回类型说明
再往下是实战部分,即代码的举例与其输出
注意:库函数的使用务必包含对应的头文件,比如这个sqrt就需要在使用前写上 #include<math.h>
最后,它还有一个相关知识链接的拓展
至此,一份库函数文档阅读完毕!
下面是我根据这份文档总结的关于sqrt函数的用法
这里,我来给大家总结一下这个库函数文档的一般格式
1. 函数原型
2. 函数功能介绍
3. 参数和返回类型说明
4. 代码举例
5. 代码输出
6. 相关知识链接
最后我想告诉大家:库函数的学习不用着急一次性全部学会,我们只需要慢慢学习,各个击破就行
二.自定义函数
当我们了解了库函数之后,我们的关注点就应该聚焦在自定义函数上,自定义函数其实更加重要
下面我们就来学习一下它的用法吧!
1.语法形式
有没有发现,其实自定义函数和库函数的形式差不多,只不过因为这个函数的功能要自己实现,所以多了{ }函数体用来实现功能,所以我们要学会举一反三的学习方式才能使学习事半功倍
2.举例
下面来举个例子,我们用自定义函数来实现2个整型变量的加法操作
三.形参和实参
在函数使用的过程中,把函数的参数分为,实参和形参。 再看看我们前面写的代码
我们是先进行函数的定义,再对函数进行调用
所以我们把调用Add函数时,传递给函数的参数a和b,称为实际参数,简称实参实际参数就是真实传递给函数的参数
而定义函数的时候,在函数名 Add 后的括号中写的 x 和 y ,称为形式参数,简称形参。
为什么叫形式参数呢?
实际上,如果只是定义了 Add 函数,而不去调用的话, Add 函数的参数 x 和 y 只是形式上存在的,不会向内存申请空间,不会真实存在的,所以叫形式参数。形式参数只有在函数被调用的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是形式的实例化
其实这个现象是可以通过调试观察到的,大家可以尝试一下
下面是我调试的一次结果
我们在调试的可以观察到,x和y确实得到了a和b的值,但是x和y的地址和a和b的地址是不一样的,所以我们可以理解为形参是实参的一份临时拷贝
四.return语句
在函数的设计中,函数中经常会出现return语句,这里讲一下return语句使用的注意事项。
1.return后边可以是一个数值,也可以是一个表达式,如果是表达式则先执行表达式,再返回表达式的结果
2.return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况
3. return返回的值和函数返回类型不一致,系统自动将返回的值隐式转换为函数的返回类型
4. return语句执行后,函数就彻底返回,后边的代码不再执行
5.如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误
五.数组做函数参数
在使用函数解决问题的时候,难免会将数组作为参数传递给函数,在函数内部对数组进行操作。 比如:写一个函数对将一整型数组的内容,全部置为-1,再写一个函数打印数组的内容
我们先写出主函数,来明晰这段代码的整体架构
而对于这两个函数,我们不妨命名为 set_arr 和 print_arr
我们将数组作为参数传递给了set_arr 和 print_arr 函数,接下来我们来设计一下这两个函数、
示例如下
将这两端拼起来,我们的代码就写完啦!
六.嵌套调用和链式访问
1.嵌套调用
嵌套这个概念我们在讲循环的时候已经讲过了,不知道大家还记得吗,其实嵌套调用就是函数之间的互相调用,下面我们通过一个例子来理解
举例:
假设我们计算某年某月有多少天?,如果要函数实现,可以设计2个函数
1.is_leap_year():根据年份确定是否是闰年
2.get_days_of_month():调用is_leap_year确定是否是闰年后,再根据月计算这个月的天数
下面是这两个函数的代码示例
下面是主函数
在这个例子中就体现了循环调用的思想
main 函数调用get_days_of_month,然后get_days_of_month 函数调用 is_leap_year
未来的稍微大一些代码都是函数之间的嵌套调用
BUT函数是不能嵌套定义的!!!
2.链式访问
所谓链式访问就是将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串起来就是函数的链式访问
比如:
我们来看一下下面这个有趣的代码 它执行的结果会是什么呢?
在看这段代码前,我们得先知道一个关于printf函数返回的知识点
我直接下结论了 : printf函数返回的是打印在屏幕上的字符的个数
然后我们来看上面的这段代码
第一个printf打印的是第二个printf的返回值,
第二个printf打印的是第三个 printf的返回值。
第三个printf打印43,在屏幕上打印2个字符,再返回2 第二个printf打印2,在屏幕上打印1个字符,再放回1 第一个printf打印1
所以结果应该是 4321 运行一下看一下结果吧
果然是这样!
所以,将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串起来就是函数的链式访问
七.课后练习
想对C语言基础语法有更多的了解,推荐大家在牛客网这个平台上多多刷题,在线编程哦
下面是牛客网_语法篇_基础语法篇的链接,大家可以在里面找到与目前水平相匹配的题目去做
https://www.nowcoder.com/exam/oj?page=1&tab=%E8%AF%AD%E6%B3%95%E7%AF%87&topicId=290
结语:
好了今天的分享就到这里了
哦,对了,如果大家觉得博客在哪里需要改正,可以在评论区留言呀,感谢感谢
也希望大家给这个萌新博主点个赞吧(求求)
让我们在接下来的时间里一起成长,一起进步吧!