函数是C语言的基本单位,类是Java、C#、C++的基本单位。
为什么需要函数
- 避免了重复性操作——重复执行的某个功能,调用函数去实现;
-
什么叫函数
逻辑上
物理上
能够接收数据【当然也可以不接收数据】——传参;
- 能够对接收的数据进行处理;
- 能够将数据处理的结果返回【当然也可以不返回任何值】——return值。 ```c int f(void) //括号中的void表示函数不能接收数据,int表示函数返回值是int型 { return 10; //向主函数返回10 }
void ff(void) //函数名前面的void表示该函数没有返回值 { return 10; //错误,与该函数的void类型相矛盾 }
<a name="dWapI"></a>
### 总结
函数是一个工具,它是为了解决大量类似问题而设计的。
<a name="VMWrP"></a>
# 如何定义函数
```c
* 函数的语法
函数的返回类型 函数的名字(函数的形参列表)
{
函数的执行体;
}
函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法;
return表达式的含义
函数返回值的类型也称函数的类型,若函数的返回类型与函数执行体中的return表达式类型不同,函数最终返回的值的类型,以函数声明时的返回类型为准。
return与break的区别
终止被调函数,向主调函数返回表达式的值;
- 如果return表达式为空,则只终止函数,不向主调函数返回任何值;
- break是用来终止循环和switch的,return是用来终止函数的。 ```c void f() { return ; //仅终止函数,不向主调函数返回任何值 }
int ff() { return 10; //终止函数,并向主调函数返回数值10 }
<a name="JZYQ6"></a>
# 函数的分类
- 有参函数和无参函数;
- 有返回值函数和无返回值函数;
- 库函数和自定义函数;
- _值传递函数和地址传递函数_;
- 普通函数和主函数(main函数)
- 一个程序有且仅有一个主函数;
- 主函数可以调用普通函数,普通函数不可调用主函数,普通函数间可以相互调用;
- 主函数是程序的入口,也是程序的出口。
<a name="2DmdL"></a>
# 注意的问题
<a name="7gZPB"></a>
## 函数调用和函数定义的顺序
如果函数调用写在了函数定义之前,则必须在文件的头部增加函数的前置声明。
- 告诉编译器即将可能出现的若干个字母代表的是一个函数;
- 告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值的具体情况;
- 函数声明是一个语句,末尾必须加分号;
- 对库函数的声明是通过#include"库函数所在的文件的名字.h"来实现的。
<a name="zTLZD"></a>
## 形参和实参的相互关系
- 个数相同;
- 位置一一对应;
- 数据类型必须相互兼容。
<a name="sfGjA"></a>
## 如何在软件开发中合理地设计函数来解决实际问题
- 一个函数的功能尽量独立、单一;
- 多学习、模仿牛人的代码规范。
<a name="WOFqQ"></a>
# 常用的系统函数
```c
double sqrt(double x);---->求x的平方根
int abs(int x);---->求x的整型绝对值
double fabs(double x);---->求x的浮点绝对值
专题
递归
栈
要理解递归,要先理解栈。
A函数可以调用B函数的原因是:
- A函数会把B函数里面的形参、A函数下一个语句执行的地址、以及为B函数的形参所分配的空间,全部压栈;
- A函数把B函数调用完,就是把B函数的出栈。
递归就是A函数调用A函数,出入栈的方式与A函数调用A函数类似。
变量的作用域和存储方式
全局变量
使用范围
局部变量
在一个函数内部定义的变量或者函数的形参,都统称为局部变量。
* 举例
void f(int i)
{
int j = 20;
}
** i和j都属于局部变量