函数的意义
- 函数解决了代码段复用的问题:相同功能的代码段可以直接重复使用,相似的或者仅仅是某个参数不同的,可以用带参数的函数解决。
- 函数减少了代码的总长度,因为重复的只出现一次。
- 函数让主调用代码或主调用函数的结构更加清晰。
- 当软件开发是多个人时,相互之间可以通过函数调用提高开发效率。
函数的定义和使用
函数是一块代码,接受零个或多个参数,做一件事情,并返回零个或一个值。
函数的定义
<返回类型> 函数名称([<参数类型> 参数名称, ...]) // 函数头:返回值类型,函数名称,参数表
{
函数体
}
注意
- 没有返回值的函数
- 函数没有返回值,使用
void
进行标识;即void 函数名(参数列表)
- 不能使用带值的return,也可以没有
return
语句 - 调用没有返回值的函数时,不能进行赋值操作
2.有返回值的函数
- 函数体内必须有带值的
return
语句
函数调用
函数名称(函数的yi参数表);
注意
- 调用函数时,
()
起到了表示函数调用的重要作用,即使没有参数也需要()
。 - 函数如果有参数,调用时,需要给出正确的数量和顺序。
- 当函数有返回值时,
return
为函数返回标记,return
关键字停止函数的执行,并返回一个值。 - 一个函数中可以出现多个
return
语句
函数的参数和变量
函数的原型
对于C语言编译器来说是自上而下顺序分析程序猿编写的代码,因此函数有先后关系。
在进行函数调用时,必须要知道函数的基本信息:返回值、函数名称、参数个数、参数类型、参数顺序,为了解决这个问题,主要有两种方式:
- 函数定义在函数调用之前;
- 通过函数原型进行声明。
函数原型的语法:
使用函数头,并以分号;
结尾,就构成了函数的原型
函数原型的目的:
告诉编译器函数的基本信息:名称、参数(数量及类型)、返回值类型
注意
- 函数调用时,会根据函数原型进行自动类型转换。
- 函数原型的位置建议放在头文件之后(也可以放在对应函数体内的首行,但是不推荐)。
- 函数原型中可以将函数参数名省略掉,但是为了程序的可读性,建议函数声明与函数定义时的函数头保持一致。
参数传递
如果函数有参数,进行函数调用时必须传递给它数量、类型正确的值(实参)。
值(实参)的类型有:
- 字面量
- 变量
- 函数的返回值
- 计算的结果
当传递的参数的类型不匹配时,将怎么办?
调用函数时给的值与参数的类型不匹配是C语言传统的漏洞,C语言的编译器总是会进行自动类型转换,以至于最终的结果往往不符合预期。函数调用时,传递过去的内容是什么?
C语言在调用函数时,传递的内容是值。
传值过程中,有如下注意事项:
- 每个函数都有自己的变量空间,参数(形参)也位于这个独立的空间中,和其他函数没有关系。
- 形式参数(参数);实际参数(值)
本地变量
函数的每次运行会产生一个独立的变量空间,在这个空间中的变量,是函数的这次运行独有的,称作本地变量。函数中的参数也是本地变量。
本地变量的性质:
- 生存期:什么时候这个变量开始出现了,到什么时候它消亡了。
- 作用域:在代码的什么范围内可以访问这个变量(这个变量可以起作用)
区分规则:大括号{}
——块
本地变量的规则:
- 本地变量是定义在块内的
定义在函数的块内
定义在语句的块内
定义在某一对大括号内 - 程序运行进入这个块之前,其中的变量不存在,离开这个块后就消失了
- 块外面定义的变量在块内仍然有效
- 块内定义的变量覆盖了块外同名的变量
- 不能在同一个块内定同名的变量
- 本地变量不会默认初始化
函数小细节
没有参数的函数
定义没有参数的函数时,使用如下:
// 函数声明
<返回值类型> 函数名称(void);
// 函数定义
<返回值类型> 函数名称(void) {
函数体
}
<返回值类型> 函数名称();
参数列表位置表什么也没有写,它表示参数的参数表未知,并不表示没有参数。
#include <stdio.h>
void print(int a, int b);
int main()
{
int a, b;
a = 5;
b = 6;
print(a, b); // 正常输出:第一个参数:5, 第二个参数:6
return 0;
}
void print(int a, int b)
{
printf("第一个参数:%d, 第二个参数:%d\n", a, b);
}
进行如下修改:
#include <stdio.h>
void print();
int main()
{
int a, b;
a = 5;
b = 6;
print(a, b); // 编译时报错或运行时出现bug
return 0;
}
void print(double a, double b)
{
printf("第一个参数:%lf, 第二个参数:%lf\n", a, b);
}
部分编译器直接报错,部分编译器将能够运行,但是运行结果错误,出现bug
逗号运算符 VS 函数调用时的逗号
- 函数调用时的逗号表示标点符号
- 逗号运算符表示一个运算符
函数里的函数
C语言中不允许函数嵌套定义,但是可以进行在某个函数内进行函数声明。
关于main函数
C语言中main()
函数是程序的入口函数,这个是针对程序猿来说的。对于整个程序来说,main
函数不是程序运行的首条指令。
main
函数中的return
信息是有效的,返回0表示正常结束;返回非0表示异常结束。main
函数的return
信息是在编写批处理文件(如.sh,.bat等文件)时使用。