一、函数概念?
1、 在linux C语言中,什么是函数?
C语言是一种面向过程的语言,C语言称之为函数式语言,可以将任何功能都封装成一个函数接口。
2、 在C语言中,封装函数意义?
在某些功能比较复杂,往往用户需要将其封装成一个函数接口,调用者使用该函数时,不需要关注过程,只需要知道传递什么参数和函数有什么返回值即可。
play_music(“xxx.mp3”); -> 参数就是这首歌名字。
听到这首歌 -> 返回值就是听到声音。
二、函数的书写规则?
1、 在linux C语言中,函数有哪些种类?
main函数: 主函数,在C语言中有且仅有一个,一般都在main函数开始执行,然后调用别的函数。
系统函数(system calls):man手册的2手册中,这些函数不需要用户写实现过程。
库函数(library calls):man手册的3手册中,这些函数不需要用户写实现过程。
自定义函数:不能在man手册查询得到,用户必须写清楚实现过程。
例子:
#include <stdio.h>
//1. main函数
int main(int argc,char *argv[])
{
//2. 调用printf()库函数
printf("helloworld!\n");
//3. 调用自定义函数
func(); //undefined reference to `func' -> func()实现过程没有定义!
return 0;
}
2、自定义函数的书写规则?
1)确定函数的函数名 -> 函数名字最好体现函数的功能
命名规则: 与C语言中变量一样。 例子: my_fun
2)确定函数的形式参数列表
有形式参数:my_fun(形式参数1,形式参数2, … ,形式参数n) -> 有多少个形参,将来就需要传递多少个实参。
无形式参数:my_fun()
什么是形式参数?
形式参数在函数中作用,首先声明好,要调用该函数,首先需要什么参数。
例子: 露营(一张大被子,一张厚席子,一个高枕头,一个绿色桶)
例子:my_fun(int a,int b) -> 说明调用该函数时,需要传递二个整型数据给这个函数!
3)确定返回值类型 -> 写在名字前面
有返回值 -> 确定返回值类型
int -> 无论这个函数是调用成功还是失败,都会返回一个int类型。
char -> 无论这个函数是调用成功还是失败,都会返回一个char类型。
float -> 无论这个函数是调用成功还是失败,都会返回一个float类型。
例子:
int my_fun(int a,int b)
return 0;
无返回值 -> void -> 代表该函数没有返回值
例子: void my_fun(int a,int b)
返回值类型 函数名字(形式参数列表) -> 自定义函数头
4)函数体 -> {}
例子:
int my_fun(int a,int b)
{
-> 功能就写在函数体中
}
3、如何调用函数?
1)确保调用函数实现过程已经写好了!
例子:
int my_fun(int a,int b)
{
printf("a = %d\n",a);
printf("b = %d\n",b);
return 0;
}
2)直接写函数名字,后面紧跟一个圆括号(),圆括号中存放东西就是实际参数(实参)。
例子:
my_fun(5,10);
结论: 形式参数值由实际参数直接初始化。 -> 这是不可逆的过程。
上述例子: a=5,b=10;
4、函数返回值情况
int my_fun(int a,int b) -> 需要接受两个参数,返回一个int类型数据。
int ret;
ret = my_fun(5,10); -> 将my_fun函数的返回值结果赋值给ret。
练习3:写一个函数实现接收三个int参数,经过约定的运算后,得到结果并打印出来。
前面两个参数是计算,最后参数计算方式。
计算方式:
1 -> +
2 -> -
3 -> *
4 -> /
fun(3,4,2) -> 结果: 3-4=-1
fun(3,4,3) -> 结果: 3*4=12
#include <stdio.h>
int my_fun(int x,int y,int z) // x=a y=b z=c
{
int ret;
switch(z)
{
case 1:
ret=x+y;
break;
case 2:
ret=x-y;
break;
case 3:
ret=x*y;
break;
case 4:
ret=x/y;
break;
default:
printf("enter error!\n");