上节课咱们说了,函数就是一个小工厂,你把原材料扔进去,它在里头给你加工,完了把成品吐出来。
那这节课咱们就来讲讲,在C语言里,这个“小工厂”到底是怎么盖起来的——也就是函数的定义。
说白了,函数定义就是一套固定的“八股文”格式,你照着这个格式写,编译器就认识它。格式长这样:
返回值类型 函数名(参数列表) { 函数体; return 返回值; }
看着有点晕?别怕,咱们把它拆成四个部分,一个个说。
第一部分:函数名——你这工厂叫啥?
就跟人要有名字一样,函数也得有个名字。你要给它起个能见名知意的名字。比如你要写一个计算两个数相加的函数,就叫add;要算圆面积的,就叫calcCircleArea。
C语言对函数名的要求跟变量名一样:字母数字下划线组成,不能以数字开头,别跟关键字重名。
第二部分:参数列表——工厂的“收料口”
函数要干活,总得有人给它喂材料吧?参数列表就是那个“收料口”。你在括号里写上需要什么东西,用逗号隔开。
比如你要写一个加法函数,需要两个整数来加,那参数就写成int a, int b——告诉编译器:我要两个整数,一个叫a,一个叫b,你给我准备好。
如果你这个函数不需要任何外部数据,括号里就写void,或者直接写个空括号。比如我想写一个函数,就是打印一行“Hello”,不需要你给它任何东西,那参数就是空的。
第三部分:返回值类型——工厂的“出货口”
工厂加工完了,得把成品递出来。这个“递出来”的东西是什么类型的,你要在函数名前面写清楚。
如果你这个函数算完要返回一个整数,前面就写int;要返回小数,就写float或double;要返回字符,就写char。
那如果这个函数干完活不需要往外递东西呢?比如它就是打印个菜单、显示个提示信息,干完就完了,不需要给你带回来啥。这种情况,返回值类型就写void——表示“啥也不返回”。
第四部分:函数体 + return——工厂的生产车间
花括号里面那一坨代码,就是工厂的生产车间,是你真正干活的地方。你需要什么原材料,从参数那里拿;你要出什么成品,用return语句送出去。
return的作用有两个:一是告诉你“我要返回这个值了”,二是把控制权交还给调用者——也就是返回到调用这个函数的地方。
来,咱们看一个完整的例子,写一个加法函数:
int add(int a, int b) { int result = a + b; return result; }
翻译成人话就是:我盖了一个叫add的小工厂,它从外面接收两个整数(a和b),然后在车间里把它们加起来,放到一个叫result的盒子里,最后通过return把这个盒子递出去。因为这个工厂要递出去的是一个整数,所以我前面写了int。
这个函数写完,你就能在别的地方调用它了:
int x = add(3, 5); // x就变成了8
你看,3和5被喂进了参数a和b,车间里算出了8,return把8递出来,赋值给了x。
有返回值的函数,return后面必须跟一个值,而且这个值的类型要跟函数前面声明的返回值类型匹配。 你声明了int,return了一个float,编译器虽然不一定会报错,但会给你截断,结果就不对了。
没返回值的函数,可以不用return,或者只写个return;,后面啥也不跟。
void printMenu() { printf("1. 加法\n"); printf("2. 减法\n"); printf("0. 退出\n"); // 不需要return,干完活直接走人 }
最后,给同学们强调一句总结:
函数的定义不是让你背语法,而是让你养成一个习惯——在写代码之前先想清楚三件事:我这个函数要处理什么数据(参数)、处理后要给调用者一个什么结果(返回值类型)、中间怎么处理(函数体)。把这三点想明白了,函数定义就是照葫芦画瓢的事儿。