内容介绍:
一、开发中遇到的问题
二、函数的定义
三、函数的声明
四、函数的参数和返回值
一、目前我们在开发中遇到的问题
随着程序规模的变大
- main函数变得相当冗杂(因为将所有代码量三百行代码都扔到main函数里)
-程序复杂度不断提高
-代码前后关联度高,修改代码往往牵一发而动全身(比如说在最上面的位置修改了变量的命名,在下面的代码就要修改好几十处)
-变量的命名都成了问题(因为简单的名字都用完了,比如小明、小红、阿黄这些名字都用过了,所以只能用小明1号、小明2号这种名字)
-为了在程序中多次实现某功能,不得不重复多次写相同的代码
讲解主题就是为了解决上面的这些痛点,函数从第一个程序开始就一直在用,在屏幕上打印hello world字符串的时候,使用的是printf函数,这是一个标准库的函数,是c语言为我们提供的,有了它就可以在屏幕上输出格式化的内容。
C语言的标准库还提供了很多各种其他功能的函数,有处理字符串的要引入string的头文件、有数学计算要引个math的头文件,有输出输入就是printf、scanf之类的,还有进程管理有信号、有接口处理的。
有了这些函数,就不再需要去关注内部的实现细节,而只需要将注意力放在程序的实现逻辑上就可以了。
比如说要打印字符串到屏幕上,只需要知道调用printf函数,然后并给他传递我们要打印的字符串,要传递这个内容过去就可以了,至于他是如何做的细节不需要知道。
作为一门高级的编程语言,c语言是支持我们自己来封装函数的。
当我们将代码段根据其功能封装为一个个不同的函数,往大了说这叫做模块化程序设计,往小处说实际上就是把大的计算部分分解成若干个小的任务来单独实现,就是把main函数拆开,根据功能划分成不同的段落,这就是函数、封装。
封装一个函数print_ C,调用它就可以打印。
#incLude <stdio.h>
void print_C(); // 函数的声明
//函数的定义
void print_C()
{
printf(" ##### \n") ;
printf("## ##\n");
printf("## \n");
printf("## \n");
printf("## \n");
printf("## ##\n") ;
printf(" ###### \n") ;
}
int main( )
{
print_C(); // 调用函数
return 0;
}
使用这个程序:gcc test1.c && ./a.out
如果想要打印多个,就多次调用函数。
int main( )
{
print_C(); // 调用函数
printf("\n");
print_C();
printf("\n");
print_C();
return 0;
}
使用这个程序:gcc test1.c && ./a.out
函数就是对多个代码段的封装,使用print_C();就会执行很长一段代码。
二、函数的定义
类型名 函数名(参数列表)
{
函数体
}
类型名:函数的返回值,如果这个函数不准备返回任何数据,需要写上void表示不返回数据,void是空类型、无类型。
函数名:指函数的名字,一般根据函数的实现功能来命名,比如说print_C就是打印C。
参数列表:指定了参数的类型和名字,如果说这个函数没有参数,那么这个位置的直接写上小括号就可以了,但是不能什么都不写,就算没有参数也要写个小括号。
函数体:指的是函数的具体实现过程。
三、函数的声明
所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。
有时候就算不写函数声明程序也是可以正常执行的,但如果你把函数的定义写在函数之后呢,编译器就可能找不着北了。
#incLude <stdio.h>
int main( )
{
print_C(); // 调用函数
return 0;
}
//函数的定义
void print_C()
{
printf(" ##### \n") ;
printf("## ##\n");
printf("## \n");
printf("## \n");
printf("## \n");
printf("## ##\n") ;
printf(" ###### \n") ;
}
编译器会提醒报错
因为调用print_C();时,程序的流程是从上到下的,编译也是如此。
四、函数的参数和返回值
有时候函数需要接收用户传入的数据,那么就需要使用到函数的参数,这是灵活定制函数的一个方式,根据需求函数的参数的数量可以有多个,类型的也可以各不相同,而函数的返回值通常是反馈这个函数的计算结果,也可以用来表示函数的执行结果。
就函数执行成功返回true,函数执行失败返回false,C语言只有布尔类型支持true和false。
编写一个函数sum,由用户输入参数n,计算1+2+3+.。.+(n-1)+n的结果并返回。
#incLude <stdio.h>
int sum(int n); // 函数的声明
Int sum(int n) // 函数的定义,也说明了参数的类型,形参
{
int result = 0;
do
{
result += n;
} while(n-- > 0) ;
return result;
}
int main( )
{
int n, result;
printf("请输入n的值: ");
scanf("%d", &n) ;
result = sum(n) ; // 调用的参数为实参
printf("1+2+3+...+(n-1)+n的结果是: %d\n", sum(n));
return 0 ;
}
使用这个程序:gcc test2.c && ./a.out
编写一个函数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;
printf("请输入两个整数:“);
scanf ("%d%d '&a,&b);
c = max(a, b);
printf("它们中较大的值是: %d\n", c);
return 0 ;
}
使用这个程序:gcc test3.c && ./a.out
这里有两个return,但不代表有两个返回值,函数一旦遇到return语句就会立即返回。
if (x>y)
return X ;
else
return y ;
printf("小甲鱼你好帅啊!\n")
printf语句不会被执行,因为这个程序在遇到return语句的时候直接返回值,不会再往下执行。