目录
前言
函数是什么
函数的构成
函数的定义与调用
函数分类
库函数
库函数的使用
自定义函数
函数的参数
实际参数(实参)
形式参数(形参)
函数的调用
传值(数值)调用
传址(地址)调用
练习
判断素数
判断闰年
前言
近期博客一天一更,更新C语言知识点,知识点连贯详细,关注支持一下!
函数是什么 函数是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。函数最好 高内聚低耦合(高内聚就是函数内部的语句要高度的聚集和关联,低耦合就是函数与函数之间关联程度越低越好,最好互不影响) ,所以函数的功能最好单一。
代码执行是从上往下遍历,在main函数使用自定义函数的时候,如果自定义函数没有创建在main函数之前,或声明没有在main函数之前,编译器会报错!函数的声明需要返回类型+函数名+(参数类型)即可,参数可以不写。
高内聚低耦合的好处就是,函数自己能够单独完成一个特定的任务,函数与函数之间的几乎没有关系,在运行的时候出现bug,可以很好的确定错误的地方,减少调试的时间。方便维护、升级代码。就像上面的print1函数只用来打印Hello,print2函数用来打印World,如果没有打印Hello,就可以清楚的判定出是print1函数出现了问题,这时候只需要对print1函数进行调试,修改代码即可。程序员编写的自定义函数,代码更为复杂,函数功能单一,可以更好的确定错误地方!
函数的构成
返回类型+函数名+(函数参数)+{函数主题}
返回类型:一个函数可以返回一个值。int返回类型,结束标志为return 整形;void返回类型,结束标志直接return;char返回类型,结束标志return 字符......函数是否有返回类型决定是否能够实现链式访问(函数的返回值作为另一个函数的参数)。
函数名:作为使用函数的标志,函数的名字最好起的有意义。注:函数名不能用关键字来命名!
参数:参数就是你使用该函数需要提供的值,作为使用函数的原材料,函数自动完成功能。
函数主体:执行语句,功能实现的代码。
函数的定义与调用
函数可以嵌套调用但是不能嵌套定义!函数调用自身叫做递归函数(下一期博客内容——递归函数)。
这里只在main函数中调用了print1函数,print1函数中用调用了print2函数,所以print1和print2函数的内容都打印了。
函数分类
库函数
早期是没有库函数的,像printf库函数这些,功能简单,实现也简单,但是一个大型程序中很多人都编译了功能相同printf函数,导致代码冗余,开发效率低,而这些函数的使用又有所差异。通过C语言标准,后面把一些常用的功能实现成库函数,集成成库,编译器自动导入静态库,只要引入#include<头文件>就能使用函数,提高了程序的效率。
库函数的使用
参考网站,英文文献
http://www.cplusplus.com/reference/cstdlib/system/?kw=system
自定义函数
自定义函数和库函数一样,有返回值类型、函数名和函数参数。但是函数的功能可能更为复杂,需要程序员来设计。
函数的参数
实际参数(实参)
使用函数时候传递的参数叫做实参,实参可以是变量、常量、表达式等等。形参在函数被调用的时候才会创建,创建后相当于实参的一份临时拷贝,值相同,但是不是同一个。
形式参数(形参)
创建函数时()括号内部的参数叫做形参。注:形参只要在函数被调用的时候才会被创建(在内存中开辟空间),函数使用完后形参以及函数在内存开辟的空间自动销毁,还给操作系统。
函数的调用
传值(数值)调用
传值调用是传递实参的值给形参,它们分别占用不同的内存,对形参的修改不会影响实参。
这里的a,b就是实参,x,y,t就是形参。
之所以会出现这种情况是因为,调用swap的时候传递的是值,把a拷贝到x上,把b拷贝到y上,它们的地址并不一样,它们之间并不是同一个变量,x和y交换,并不会影响到a和b,为了在swap函数中能够交换a和b的值,传a和b的地址,才能在swap函数中与main函数的a和b建立联系。
当不需要对函数调用的值进行修改的时候使用传值调用即可。
传址(地址)调用
传址调用是把数据在内存中地址传递给函数,函数参数需要用指针来接收。这种传参方式可以让函数和函数外边的数据建立起真正的联系,也就是函数内部可以直接操作函数外部的数据。
这里要介绍两个操作符,&是取出地址;*是解引用,通过地址找到那个变量;int* x的意思是:*表示x是指针变量,int表示x指针变量所指向的类型是int类型的(这里主要是讲函数,指针作为C语言另一大重点,后面另写一两篇博客讲指针)。
注:传值的调用的功能比传值调用的功能更加强大,根据需求看实参是否需要修改,并且传址调用,能够提高效率。像是结构体这样的,会有很多的数据,如果使用传值调用,结构体过大,参数在栈区的消耗过大,会导致性能下降。
练习
判断素数
判断100-200中的数有多少个素数,并且打印素数。
素数: 素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
代码
#include#include //函数判断是不是素数,是返回1,不是返回0 int prime_number(int n) { int i = 0; //作为一个素数标志 int flag = 1; //sqrt是开更,头文件是math.h for (i = 2; i <= sqrt(n); i++) { if (n % i == 0) { //如果能够整除,说明不是素数,把flag改为0 flag = 0; break; } } return flag; } int main() { int count = 0; int i = 0; for (i = 100; i <= 200; i++) { //如果函数返回1,则说明是素数 if (1 == prime_number(i)) { count++; printf("%d ", i); } } printf("n"); printf("count = %dn", count); return 0; }
结果:
判断闰年
判断1-1000的年份有多少个闰年
闰年:能被四整除但是不能被100整除或者能被400整除的为闰年。
代码:
#include#include //函数判断是不是闰年是返回1,不是返回0 int leap_year(int year) { //条件为真是1,条件为假是0 return ((year % 4 == 0) && (year % 100 != 0) || year % 400 == 0); } int main() { int count = 0; int i = 0; for (i = 1; i <= 1000; i++) { //如果函数返回1,则是闰年 if (1 == leap_year(i)) { count++; } } printf("count = %dn", count); return 0; }
结果:
感谢大家的观看,觉得文章写得不错的话,点赞、评论、关注支持一下,后续还会整理别的知识点,若文章编写出现错误,麻烦在评论或者私信一下,我看到后及时更改,谢谢。



