这是根据小甲鱼视频而整理的,用来复习函数以及加深对函数的理解。
一.问题
在学习函数之前,随着程序规模的变大,我们会遇到越来越多的问题。如
①:main函数变得相当冗杂——在大括号之间通常包含着几百行代码
②:代码前后关联度高,要想修改某个变量从上至下都要检查修改。
③:重复——为了多次实现某功能,我们需要一次次的重复或者是ctrl+v复制黏贴整段代码才行
二.函数
以第一个程序helloworld为例:printf函数就是系统自带的一个函数,用来输出字符“helloworld”,至于字符串是怎么输出的,以及其中种种细节,就不用我们来考虑了,下次我们想要输出什么东西的时候,只需要用系统提供的printf函数就可以了。
作为一门高级的语言,C语言支持我们自己封装函数,即根据自己所需的功能编写并封装函数。
业务:封装一个函数叫做printf_C,调用它就可以打印一个由#字符组成的大C
#include<stdio.h>
void print_C() ; // 函数的声明,声明一个新函数叫做print_C
void print_C() //以下的代码块是该函数的定义
{
printf(" ######\n");
printf("## ##\n");
printf("## \n");
printf("## \n");
printf("## \n");
printf("## ##\n");
printf(" ######\n");
} // 一些黑客组织通常用此方法来打印组织Logo,十分炫酷
int main()
{
print_C(); //函数的调用,调用我们自己写的函数,跟调用printf函数是一样的
return 0;
}
通过这段代码我们可以看出,函数事实上就是对若干代码段的封装,调用它相当于执行了一堆代码
三.函数的定义
定义函数的格式是这样子的
类型名 函数名 (参数列表)
{
函数体
}
其中:
①类型名指函数的返回值,函数不返回任何数据的话,需要写一个void(空类型,无类型),没有写的话,默认返回整形
②函数名指函数的名字,一般用来表示函数将执行的功能
③参数列表指定了参数的类型和名字,如果没用参数的话小括号里什么也不用写
④函数体指函数的具体实现过程,由哪些代码段构成
四.函数的声明
所谓声明,就是告诉编译器我要使用这个函数。
有时候,不写函数声明程序也是可以执行的,但是函数定义绝对不能写在声明前面,这样的话编译器可能找不到北。因为程序的执行是自上而下的,编译器会不知道printf_c是什么从而可能报错。
五.函数的参数和返回值
有时候,函数需要接收用户传入的数据,那么就需要使用函数的参数。函数的参数可以有多个,类型也可以各不相同
而函数的返回值,通常是反馈函数的计算结果,也可以用来表示函数的执行结果。例如:函数执行成功,返回true; 执行失败,则返回false。
例一:编写一个函数sum,由用户输入参数n,计算1+2+3+...+(n-1)+n的结果并返回打印出来
#include<stdio.h>
int sum(int n);
int sum(int n) // int表明return后面的结果是整形 ,参数的定义事实上跟变量是一样的;这里定义的参数我们称为“形参”
{
int result = 0;
do
{
result += n;
}while(n-- > 0);
return result;
}
int main()
{
int n,result;
printf("请输入n的值:");
scanf("%d",&n) ; //接收到用户的输入放到变量n里面,作为参数传进sum,传进去的参数我们称为”实参“ ,比如我们输入100,int sum(int n);里面就接收到100,就可以在上面的函数当中直接使用
result = sum(n);
printf("结果是:%d\n",sum(n));
return 0;
}
例二:编写一个函数max,接收两个整形参数,并返回它们当中较大的值。
#include<stdio.h>
int max(int,int); //参数名可以不写,但是类型必须要写 ,语句结尾的分号必须写
int max(int x,int y)
{
if(x > y)
return x;
else
return y;
}
int main()
{
int a,b,c; //main函数里的变量名跟max函数里的变量名的函数名、参数名可以相同,也可以不同
printf("请输入两个整数:")
scanf("%d%d",&a,&b);
c = max(a,b); //实参 ,必须跟形参定义时的数据类型相同,不然报错。
printf("他们中较大的值是:%d\n",c);
return 0;
}
我们观察到,if语句后面有两个return,那么两个return代表着有两个返回值吗?
不不不,函数一旦遇到return语句后会立即返回,不再执行后面的代码