基础知识梳理
初见函数
“ 代码复制 ”是程序质量不良的表现,因为当遇到问题时,我们需要维护的可能就是多处代码了,所以我们引入函数这个知识来解决类似问题。
- 什么是函数呢?
- 函数是一块代码,接收零个或者多个参数,做一件事情,并返回零个或者一个值
- 可以先想象成数学中的函数:
- y = f(x)
函数定义需要函数头以及函数体
在函数头那块有函数的返回类型,以及函数的名称,以及参数表
举例:
定义一个函数:
返回类型 函数名 ( 参数表 )
{
函数体
}
调用函数
- 函数名(参数值)
- ()起到了表示函数调用的重要作用
- 即使没有参数也需要()
- 如果有参数,则需要给出正确的数量和顺序
- 这些值会被按照顺序依次用来初始化函数中的对应参数
- 函数知道每一次是哪里调用它,会返回到正确的地方
从函数中返回值
- return 停止函数的执行,并返回一个值
- return ;
- return 表达式;
- 一个函数里可以出现多个return 语句
- 返回的值可以赋值给变量
- 返回的值可以再传递给函数
- 返回的值也可以丢弃
没有返回值的函数
- void 函数名(参数表)
- 不能使用带值的return
- 可以没有return
- 调用的时候不能做返回值的赋值
如果函数有返回值,则必须使用带值的return
函数的先后关系
在使用函数时,我们需要讲整个函数放在代码块的最前面,或者是我们将函数头放在代码块的前面,并且在结尾加上分号,这样表示只是一个函数的认知,而不是一个函数的调用。
因为c的编译器是自上而下编译我们的代码的,所以只有编译器知道,认知到我们所写的函数之后,我们才可以正确调用函数,并且在调用函数的过程中我们需要符合我们自己设计的函数的调用规则,就是函数需要几个参数,每个参数的类型如何,返回什么类型,我们都需要正确使用,这样编译器才能检查我们对函数()的调用是否正确
函数原型
- 函数头,以分号“ ; ”结尾,这样就构成了函数的原型
- 函数原型的目的是告诉编译器这个函数长什么样子
- 需要:
- 名称
- 参数(数量及类型)
- 返回类型
- 旧版标准习惯把函数原型写在调用它的函数里面
- 现在一般写在调用它的函数前面
- 原型里可以不写参数的名字,但是一般依然写上
参数传递
首先要知道调用函数的一些规则,虽然上边写过了,但是这边再强调一下:
- 如果函数有参数,调用函数时必须传递给它数量,类型正确的值
- 可以传递给函数的值时表达式的结果,包括:
- 字面量
- 变量
- 函数的返回值
- 计算的结果
类型不匹配?
- 调用函数时给的值与参数的类型不匹配时C语言传统上最大的漏洞
- 编译器总是悄悄替你把类型转换好,但是这很可能不是你所期望的
- 后续的语言,C++/Java在这方面很严格
函数初使用
代码如下,建议配合上面函数的介绍一起阅读:
#include <stdio.h>
void sum(int begin, int end); //声明存在这个函数 ,可以不写变量名称
int main()
{
sum(1,10);
sum(20 , 30);
sum( 35 , 45);
return 0;
}
void sum(int begin, int end)//对这个函数的定义
{
int i;
int sum =0;
for (i=begin ; i<=end ; i++){
sum +=i;
}
printf("%d到%d的和是%d\n", begin, end ,sum);
}
输出结果为:
1到10的和是55
20到30的和是275
35到45的和是440
函数的初试验,代码如下,建议配合上边的函数解释一起相互映照理解:
#include <stdio.h>
void cheer(int i)
{
printf("cheer %d",i);
}
int main()
{
cheer (2.1);//输入类型与定义类型不同则出现误差
return 0;
}
输出结果为:
cheer 2
C语言在调用函数时,永远只能传值给函数
传值
- 每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
- 过去,对于函数参数表中的参数,叫做“ 形式参数 ”,调用函数时给的值,叫做“ 实际参数 ”
- 由于容易让初学者误会实际参数就是实际在函数中进行计算的参数,误会调用函数的时候把变量而不是值传进去了,所以我们不建议继续用这种古老的方式来称号它们
- 我们认为,它们是参数和值的关系
本地变量(多看看)
- 函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称为本地变量
- 定义在函数内部的变量就是本地变量
- 参数也是本地变量
变量的生存期和作用域
- 生存期:什么时候这个变量开始出现了,到什么时候它消亡了
- 作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)
- 对于本地变量,这两个问题的答案是统一的:大括号内——块
本地变量的规则
- 本地变量是定义在块内的
- 它可以是定义在函数的块内
- 也可以是定义在语句的块内
- 甚至可以随便拉一对大括号来定义变量
- 程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了
- 块外边定义的变量在块的里面仍然有效
- 块里面定义了和外面同名的变量,则块内定义的会覆盖了外面的
- 不能在一个块内定义同名的变量
- 本地变量不会被默认初始化
- 参数在进入函数的时候就被初始化了