详解C语言初阶之函数

 更新时间:2021年11月12日 10:57:40   作者:鲸落之·海  
这篇文章主要介绍了C语言中的初阶函数,介绍了其相关概念,具有一定参考价值。需要的朋友可以了解下,希望能够给你带来帮助

 1.main函数

第一个函数是我们的main函数,它无处不在,main函数被称之为我们的入口函数,程序在运行时,从main函数进入,从main函数出来,main函数其实就是整个程序功能的集合,所有的功能必须被包含在main里面才可以被运行(预处理命令,宏定义,全局变量什么的当然要优先处理,再次不讨论这些)。我们看个例子吧

上图中,一个很简单的打印,却发现main函数之外的打印出现了错误,由此说明main的重要型。

     说白了,函数就是一个个功能的集合,内部也是一串串代码组成的程序,是程序的基本单元,又被叫作子程序,我们将函数分为库函数和自定义函数,再次我们主要了解自定义函数。

2.自定义函数

 所谓自定义函数,就是我们自己写的函数,我们自己设置了他们的功能,将他们进行封装,在某些时候进行调用。如:

在这里,我们把一个简单地加法运算进行了封装。只要在main函数里调用这个定义函数,我们即可实现加法的功能。

那么,有人问了,我们为什么非要写一个函数呢,看起来就很麻烦,直接写到main函数里不就行了吗?

2.1  函数的的封装和面向过程的思维

      实际上,我们在应用中不可能写如此简单的小程序,我们会写很长的代码(比如我们在刚刚的程序中加上减法、除法、乘法、求余、求次方等等),很多的功能,如果我们全写在main函数里,代码的可读性就会变得极差,而且main函数不仅会变得十分冗长,对于代码的调试和修改以及后期维护都难以进行。因此,我们把所有功能都进行封装打包,扔到我们自己的一个函数里,每一个函数都有想对应的功能(一般来说,我们要尽量加大自定义函数的独立性,方便函数的封装和后期维护),如此一来,我们就有了业务逻辑(想要程序实现的功能,如加法,就在main函数里面调用Add)和功能逻辑(再对Add进行定义),main函数就变得十分简洁明了,只需要用到哪些功能时,直接调用就行了,我们将功能逻辑的功能称之为解耦。在编写代码时,我们要首先知道我们想要实现什么功能,在主函数里对某一个可以实现该功能的函数先进行调用,等主函数完备后,再讲我们封装的功能进行定义,以配合我们的调用。我们把这种编程思维,称之为面向过程,即先明白要实现什么功能(对象)后,还需要对每一个功能进行具体构建(对象的构建),而不是直接调用该功能,比如我们要木材,就必须要自己种木头,浇花施肥,然后再取用,而不能直接去木材市场买,我们需要过程。

3.函数的组成

函数需要有定义之后才能调用,某些时候还需要声明(我们先不谈声明)

函数的定义由四部分组成:返回值(也叫函数类型)、函数名 、函数体 、形参

函数的调用由三部分组成:返回值、函数名、形参

3.1函数的命名法

为了增加可读性,和减少维护成本,我们通常把函数的命名方法定为见名知意,将名字按照大驼峰法进行命名(如加法及 Add,我的打印及 MyPrint)函数名以英文单词或者英文单词的简写构成,每个单词的第一个字母大写。

3.2函数的返回值

函数的返回值类型有int、char、double等各种类型,具体看你需要的功能。

如在刚刚的Add中,我们需要Add函数返回x和y的和(即返回一个整型,便于函数值的接收),因此我们需要在Add前面加int,如此我们便可以用int ret来接收函数值。

3.2.1void类型

在各种函数的返回值中,有一个奇怪却又常用的类型,叫作void(也就是空的意思),其实,它就是个占位子的,啥都不返回(我就站这儿,告诉别人这里这个座有人了)

如图所示,我们把printf放在了Add里面,如此来,我们就不需要接收Add的返回值来进行打印了,这个函数本身就有了打印的功能,因此我们把返回值(也就是函数类型写为void),也就是没有返回值。比如main函数也可以直接void main。

补充:

1.通常情况下,我们并不建议这么写,因为我们需要函数功能的独立性,减少多余的联系,后面大家会慢慢理解

2.main 函数建议以int作为返回值,代码规范是一个优秀程序员的基本素养。特立独行并不会让你变得优秀,优秀的代码是大多数人都能明白的代码

3.既然返回值已经为空,那我直接不写不行吗,为什么还要写一个void呢?

注意:函数默认是有返回值,不写的话会进行强制返回(强制类型转换为整型),默认返回值为int,有了void,就不会有其他返回值类型来占座

3.3形参与实参

函数调用括号里的参数叫作实参,函数定义括号里的参数叫作形参。

实参就是试试在在的真是的数据,就如同一张桌子,你砸了它一角,那这张桌子一角就真的没了。

形参本质上是对实参的临时拷贝(程序从主函数中运行到函数的调用时,就会自动在主函数前寻找该函数的定义,若发现定义,就会发生形参实例化,即将实参拷贝到形参里),还是一张桌子,发生形参实例化(临时拷贝)之后,就变成了两张桌子,现在你砸了第二张桌子,那第一张桌子依旧完好无损。而不管第二张桌子是是否损伤,只要出了它所在的代码块,它就会被销毁掉,而不能被其他函数继续使用,所以我们称之为临时拷贝。

上图,我们发现,在函数定义内拷贝参数改变的值并不会影响原值。这种参数传递方式我们叫做传值。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 浅谈c++ 字符类型总结区别wchar_t,char,WCHAR

    浅谈c++ 字符类型总结区别wchar_t,char,WCHAR

    下面小编就为大家带来一篇浅谈c++ 字符类型总结区别wchar_t,char,WCHAR。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 仿现代C++智能指针实现引用计数

    仿现代C++智能指针实现引用计数

    这篇文章主要为大家详细介绍了如何仿现代C++智能指针实现引用计数,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下
    2024-03-03
  • c语言输出字符串中最大对称子串长度的3种解决方案

    c语言输出字符串中最大对称子串长度的3种解决方案

    这篇文章主要介绍了c语言输出字符串中最大对称子串长度的3种解决方案,需要的朋友可以参考下
    2014-03-03
  • opencv实现图像颜色空间转换

    opencv实现图像颜色空间转换

    这篇文章主要为大家详细介绍了opencv实现图像颜色空间转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • C语言用fun函数实现两个数的交换方式

    C语言用fun函数实现两个数的交换方式

    这篇文章主要介绍了C语言用fun函数实现两个数的交换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C语言实现文件内容按行随机排列的算法示例

    C语言实现文件内容按行随机排列的算法示例

    这篇文章主要介绍了C语言实现文件内容按行随机排列的算法,涉及C语言字符串、数组遍历与随机数相关算法实现技巧,需要的朋友可以参考下
    2017-09-09
  • C++递归算法实例代码

    C++递归算法实例代码

    这篇文章主要介绍了C++递归算法实例代码,还是比较不错的,运用了递归算法解决相关问题,这里分享给大家,需要的朋友可以参考下。
    2017-11-11
  • 简单了解C语言中主线程退出对子线程的影响

    简单了解C语言中主线程退出对子线程的影响

    这篇文章主要介绍了简单了解C语言中主线程退出对子线程的影响,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • C语言数据结构之线索二叉树及其遍历

    C语言数据结构之线索二叉树及其遍历

    这篇文章主要介绍了C语言数据结构之线索二叉树及其遍历的相关资料,为了加快查找节点的前驱和后继。对二叉树的线索化就是对二叉树进行一次遍历,在遍历的过程中检测节点的左右指针是否为空,如果是空,则将他们改为指向前驱和后继节点的线索,需要的朋友可以参考下
    2017-08-08
  • C语言 使用qsort函数来进行快速排序

    C语言 使用qsort函数来进行快速排序

    排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数
    2022-02-02

最新评论