文章目录
概念
函数原型(函数声明)
函数调用
函数定义
编写带形参的函数
黑盒
概念
1.什么是函数?
函数是完成特定任务的独立程序代码单元
2.为什么要用函数呢?
使用函数可以避免重复编写一样的代码的问题
即使程序只用一次,也一样值得使用函数,函数让程序更加模块化,提高代码的可读性,更方便维护和完善
3.描述性的函数名能清楚地表达函数的用途和组织结构(函数名尽量做到见名知意)
4.函数黑盒,给参数完成特定功能,(输入输出),如果不是我们编写的函数,根本不用去关心黑盒里发生了什么
5.在写代码之前,我们应仔细思考函数的任务,以及函数和程序整体的关系
6.如何学习函数?
函数声明
函数定义
函数调用
建立函数间的通信
下面进入正题
函数原型(函数声明)
函数原型告诉编译器函数的类型,函数和变量一样,有多种类型,任何程序在使用函数之前都要声明该函数的类型,比如下面的函数声明,看名字大概是比较两个整数的哪个大的
int max(int a,int b); //函数原型(声明)
也可以写成下面这样,可以省略变量名,但要注意分号不能丢,它标志者这是一条函数声明,放哪都可以。
一般来说,函数原型指明了函数的返回值类型和函数接受的参数类型,这些成为函数的签名,上面函数的签名是这个函数有两个整型参数,返回一个整型
在原型中使用变量名并没有实际创建变量
int max(int,int);
ANSI C也接受过去的函数声明形式,无参数列表
void ni();
这种形式最终会被淘汰,了解了解,知道也是没问题的就OK,不建议使用
函数调用
表明在此处使用此函数,像下面的函数调用就是比较4和5中的最大值
max(4,5);
执行过程:
1.当程序执行到max(4,5);时,会找到这个函数的定义并执行其中的代码
2.执行完毕,计算机返回主调函数继续执行下一行
准确的讲,函数调用的过程是编译器把C程序翻译成机器语言代码
函数定义
我们可以参考主调函数main
#include <stdio.h> int main() { return 0; }
可以看到main函数后没有分号,告诉编译器这是定义,而不是声明或原型
回到最大值的栗子,函数定义如下:
int max(int a,int b) { if(a>b) printf("%d",a); else printf("%d",b); }
编写带形参的函数
上面的就是呀,哈哈
#include<stdio.h> //函数定义 int max(int a,int b) { if(a>b) printf("%d",a); else printf("%d",b); } //闷函数,程序的入口 int main() { //函数调用 max(5,89); //主函数的结束 return 0; } //灰色的函数声明 //int max(int a,int b);
我们看到我把函数的声明给注释掉了,把函数的定义放在了最前面,神经质。。。。。可能,大概,额,我只是想说这样写是完全没问题的哦,跑题了,大连,继续说一下带参函数
这里函数定义里的 int a,int b属于局部变量,属于该函数私有,可以和程序里其他的变量重名,这不会引起冲突,它们是重名的不同变量
再来看一眼函数声明的两个参数int max(int a,int b);这俩变量成为形式参数,小名形参形参也是局部变量,属于函数私有。
ANSI C要求使用每个变量前,要声明其类型
int max(int a,int b); //无效的函数头 int max(int a,b); //无用的函数头 ***********************88888********************* //有效(但不建议使用,将要淘汰,了解) void dou(x,y,z); int x,y,z;
形参实参
简单说,形式参数是被调函数中的变量,实际参数是主调函数赋给被调函数的具体值
实际参数可以是常量,变量甚至是更复杂的表达式
实际参数是出现在函数调用圆括号中的表达式
形式参数是函数定义的函数头中声明的变量
调用函数时,创建了声明为形式参数的变量并初始化为实际结果的求值问题
黑盒
黑盒方法的核心:函数中的变量属于私有,霸道,吼吼,我喜欢,如果在闷函数中使用一样的变量名,那么它们是不影响的,相互独立的,函数黑盒发生了什么对主调函数是不可见的