用函数模块化程序设计
一、函数的基本基本信息
- 为什么要用函数
❀❀❀为实现模块化程序设计
模块化程序设计:事先编写好一些常用的函数来实现各种不同的功能,需要用时直接调用编写好的函数即可。
❀❀❀什么是函数?
❀函数:function 即使函数又是功能的意思。所以通俗的来说函数就是为实现一定的功能
❀函数分类:
(1)用户的角度
函数库:如<stdio.h><math.h>为系统提供
自定义:用于解决用户专门需要的函数
(2)函数的形式
有参函数:在主函数中,通过参数向被调用函数传递参数–执行被调用函数,会返回一个函数值,供主调函数使用。
无参函数:在主函数中,不向被调用函数传递参数–执行被调用函数,可以或者不返回一个函数值。
❀❀❀提前注意事项:
❀一个C程序由一个或多个程序模块组成。一个程序模块作为一个源程序文件,一个源程序文件是一个编译单位。一个源程序文件由一个或多个函数以及其他有关内容(指令、数据声明与定义等)组成。
所以,程序编译是以源程序文件为单位进行编译而不是函数为单位哦~
❀主函数与其他函数之间关系
》所有函数都是平行的,定义函数时分别定义相互独立。
》主函数可以调用其他函数,一个C程序的执行从主函数开始,又在主函数中结束整个程序的运行。
》其他函数可以互相调用,不能调用主函数,主函数是被操作系统调用的。
》同一个函数可以被一个或者多个函数调用多次
- 怎么定义函数
❀❀❀为什么定义函数
C语言要求必须“先定义,后使用”
❀❀❀函数的组成
❀函数的类型 :函数返回值的类型。如void int float
❀函数的名字:方便以后按名调用
❀函数的参数:参数的类型 参数的名字。以方便对调用函数传递数据
❀函数的功能:指定函数要完成什么操作
❀❀❀定义函数的方法
❀定义有参函数:函数类型 函数名称 (参数类型 参数名称)
如int max(int x,int y) {函数体} //定义一个求两个数最大值的函数
函数体包括声明部分和语句部分
❀定义无参函数:函数类型 函数名称 ()或者函数类型 函数名称 ( void)
如int max() {函数体} 或者int max(void) {函数体}
❀定义空函数:void 函数名称 ()
如void max() {函数体}
- 对被调用函数的声明和函数原型
❀❀❀调用函数的条件
❀被调用函数已经定义或者为库函数
❀若调用库函数,需要在文件开头用#include<>指令调用有关库函数信息
❀若调用自定义函数,需要对主调用函数内 声明被调用函数
❀❀❀调用函数的声明
❀什么是声明
声明的作用就是把函数名 参数类型 以及参数个数等信息通知编译系统,以便在遇到函数调用时,编译系统可以识别函数并检查是否合法。
注意 :这里声明的作用未把函数类型添加进去
❀声明的形式
1.有参函数:函数类型 函数名称 (参数类型 参数名称);
2.无参函数:函数类型 函数名称 ();
总之,声明形式:就是函数原型加分号
❀声明的注意事项
1.声明有助于编译系统检查错误。
当函数调用和函数声明不匹配时,就发出出错信息,属于语法错误。
但是未声明发现错误时,较难发现并纠正错误
2.函数声明参数名可以省略但是是形参的类型不可以省略
即系统只关心和检查参数个数和参数类型,不必考虑参数名字
3.如果在文件开头(即主调函数以及所有函数的外部),已经对调用函数声明,则在函数内部不必声明。
等一下~在休息之前,总结一些:
学了为什么使用函数 、 函数的定义 、函数的声明 。那么总结一下
函数的定义与声明的区别
函数的定义:指对函数功能的确立。包括函数类型、函数名称、函数参数(形参以及其类型)、函数体等。
函数的声明:是把函数的基本信息告诉编译器,以便在调用该函数时可以按此进行比照检查。包括函数类型、函数名称、函数参数(形参以及其类型)加上分号:;,不包括函数体。
4. 函数的调用
- 调用函数
❀❀❀函数调用的形式
❀一般形式
调用函数名称 (实参列表) 如c=max(a,b);
注意:如果没有实参,则“实参列表”可以没有,但是不可以没有括号。
❀根据形式和位置,可分为三种函数调用方式
(1)函数调用语句
单独做一个语句
要求函数完成一定操作
如print_start();
(2)函数表达式
出现在另一个表达式中
要求函数带回一个确定的值以参加表达式的运算
如:sum=a+max(a,b);
(3)函数参数
出现在另一个函数调用时的参数
如:m=max(a,max(x,y))
注意:函数调用并非一定有分号,只有函数调用形式为函数调用语句时后需要加上分号。
❀❀❀函数调用过程中实参和形参的数据传递
❀注意事项
调用函数过程中发生的形参和实参的数据传递,称为“虚实结合”
实参可以是常量、变量或表达式
形参和实参的类型和个数必须相同 或赋值兼容(如 int - long int会进行不同类型的赋值规则转换)
❀❀❀函数调用的过程
❀步骤
1.定义函数:指定形参(这些形参在未出现函数调用时,不占内存中的存储单位)
2.主调函数:实参传递给形参(此时,形参有值)
3.定义函数:返回函数值(return();语句)
4.主调函数:调用结束(形参单元被释放,实参单元任然保留)
❀❀❀函数的返回值
❀定义
通过函数调用时函数得到一个确定的值,称为函数值(又称为函数的返回值)
❀函数返回值获得
return();语句或者return;语句
当有一个以上return语句,执行到哪个return语句,哪个return语句起作用。
❀函数值的类型
1、在定义函数时指定函数值类型,应该和return语句的表达式一致,若不一致则以函数类型为准。
2、通常情况下
int max(float x,float y) //函数值为整形
char max(float x,float y) //函数值为字符型
double max(float x,float y) //函数值为双精度型
3、不指定函数值类型
编译系统默认为int 型
❀对于不带回值得函数,应该定义函数为“void”类型(或称为空类型)
- 嵌套调用
- ❀不可嵌套函数定义,但是可以嵌套函数调用
-
如m=max(a,min(a,max(a,b)));
- 递归调用
❀在调用函数的过程中,直接或者间接的调用该函数本身
-
如int f(int x) { int y,z; z=f(y); return (z); }
哈哈,关于C语言上学完了,奖励我自己一下吧!
上网查找一些事实例自检查吧