




已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章函数与编译预处理 函数的概念 定义 调用 重点和难点 变量的作用域 变量的存储方式编译预处理 6 1函数的概念 在前面几章的学习过程中 我们所介绍的所有的C语言程序都是由一个main函数组成的 但实际上 一个C程序一般情况下都是由一个main函数和若干个其它函数组成 main函数称为主函数 函数的概念 书本上没有给出函数的具体 规范的概念 一般说来 函数可以描述成 实现一定功能的程序模块 先看两个C程序的实例 这两个程序都是由一个主函数 即main函数 和若干个其它函数组成的 例1 main printstar print message printstar printstar printf n print message printf hello world n 例2 main intx y z scanf d d 由上面两例可知 1 一个C程序一般由一个或多个函数组成 其中有且仅有一个main函数 2 C程序执行时 总是从main主函数开始 又在main函数中结束 3 每个其他函数都能实现一定的功能 在main函数中可以调用其他函数 其他函数也可以相互调用 但其他函数不可以调用main函数 4 从用户使用角度看 C程序中的函数可以分为两大类 库函数和用户自定义函数 5 从函数的定义和使用形式看 函数分为两大类 有参函数和无参函数 6 2函数的定义 6 2 1无参函数的定义形式类型说明符函数名 变量说明部分 语句执行部分 其中 类型说明符可以省略不写 例如main函数定义时 类型说明符说明的是函数返回值的类型 若函数没有需要带回的值 则类型说明符可以省略 也可以写成void 如 main函数可以定义如下 voidmain 6 2 2有参函数的定义类型说明符函数名 形式参数列表 变量说明部分 语句执行部分 函数的参数无参函数在定义和使用时 都不需要任何参数 但是函数名后面的一对圆括号不能省略 有参函数的参数一般指的是该函数的操作对象 参数可分为两类 形式参数 简称形参 和实际参数 简称实参 形参是指函数定义时函数名后圆括号内的变量 一般代表该函数的形式操作对象 实参指的是函数调用时函数名后圆括号内的变量 一般代表该次函数调用的实际操作对象 例如 P108例6 2 对形参和实参的几点说明 1 形参只有在函数被调用时才分配内存单元 调用结束即释放 2 实际参数可以是常量 变量和表达式形式 但要求使用时有确定值 形参只能是变量 3 函数定义时 必须说明形参类型 4 形参和实参在数量 类型 顺序上要求严格一致 5 C语言规定 实参对形参的数据传递是 值传递 即 单向传递 即只能是实参把值传递给形参 形参操作后的值不能传回给实参 例如 main inta 3 b 4 swap a b printf d d n a b voidswap intx inty intz z x x y y z 分析程序执行后的结果 3 4 6 3函数的返回值 有时 主调函数调用了一个被调用函数后 希望该函数 被调用函数 运行完时 把运行结果带回来 这里运行结果就是被调用函数的返回值 如果 函数被调用后需要返回一个数据值给主调函数 则在该函数定义时 应说明函数返回值的类型 如果不需要返回数据值给主调函数 则该函数定义时 可以省略函数返回值类型 也可以用void明确表示不需返回值 对函数返回值作些说明 1 函数值的返回时通过在函数中使用return语句来实现的 return语句的一般形式为 return表达式 或者return 表达式 return语句一旦被执行 除了会将后面的表达式的具体值带回给主调函数 程序流程也会随之回到主调函数中去运行 本次被调用函数的执行过程结束 2 return语句中的表达式类型与函数定义时函数的类型说明符应一致 若不一致 以定义时的类型为准 自动进行类型转换 例如 设计一个用户自定义函数 用于求出某一个正整数的阶乘值 具体正整数应由主函数给出 求得的阶乘值也应在主函数中输出 分析 该用户自定义函数的功能是对某一个整数求阶乘 1 因为具体整数得由主函数传递过来 所以 该函数应设计为有参函数 且只需一个整型参数 2 因为求得的阶乘值也应在主函数中输出 所以 应将求得的阶乘值返回给主函数 故该函数有返回值 3 因为需要求阶乘的整数稍大一些 结果就会超出整型变量能表示的取值范围 所以 为了防止溢出情况出现 返回值应为float或double类型 综上分析 函数定义如下 floatjiecheng intn floatfact 1 intj for j 1 j n j fact fact j returnfact main intx floaty scanf d 6 4函数的调用 6 4 1函数调用的一般形式无参函数的调用 函数名 有参函数的调用 函数名 实参列表 6 4 2函数调用的方式 1 函数调用语句 把函数调用单独作为一条语句 一般适用于无返回值的函数调用 2 函数表达式 函数出现在一个表达式中 此时 要求函数带回一个确定的值 3 函数参数 函数调用作为另一函数调用的实参 此时 也要求函数带回一个确定的值 即后面两种调用方式都只能用于有返回值的函数调用情况 6 4 3对被调用函数的声明和函数原型一般说来 由一个主函数和若干个其他函数组成的某个C程序在书写时 主函数和其他函数之间的位置关系并不重要 主函数可以写在最前面 也可以写在中间或最后面 其他函数间也没有什么特定的位置要求 但为了程序执行正确无误 一般情况下 根据主调函数 注意 主调函数不一定是主函数 和被调用函数的位置关系 做以下说明 一 若主调函数定义在被调用函数的前面 应该在主调函数中对它将要调用的被调用函数作相应的说明 注意 是说明 不是定义 例如 P112例6 5在C语言中 函数原型说明的一般形式是 1 返回值类型函数名 参数类型1 参数类型2 2 返回值类型函数名 参数类型1参数名1 参数类型2参数名2 二 如果被调用函数定义在主调函数前面 则不需要在主调函数中进行被调用函数原型的说明工作 建议使用该种形式 6 5函数的嵌套和递归调用 6 5 1函数的嵌套调用在调用一个函数的过程中又调用了另一个函数函数嵌套调用的执行过程 P114图6 2 函数嵌套调用举例 P114例6 6 6 5 2函数的递归调用C程序中函数可以直接或间接的调用自己 这种函数调用成为函数的递归调用 一个问题采用递归方法来解决时必须符合以下条件 1 可将该问题转化为具有同样解决方法的规模较小的问题 2 必须有明确的结束条件 不能无限制地递归下去 6 6数组作为函数的参数 6 6 1数组元素作为函数参数注意 数组元素只能作为函数的实际参数 此时 函数的形式参数应该是变量形式 当数组元素作为函数的实参时 是将数组元素的值传送给对应的形参变量进行处理 此时 做的也是 单向值传递 6 6 2数组名作为函数参数可以用数组名作函数参数 此时 实参是数组名 形参是一个完整的数组定义形式 P117例题6 9说明 1 用数组名作函数参数时 应该在主调函数和被调用函数中分别定义数组 并且 每个函数内定义的数组只能在该函数内部使用 2 实参数组和形参数组类型应一致 3 在被调用函数中所定义的形参数组的大小并不重要 因为 C语言编译系统并不对形参数组大小作检查 实际上只是将实参数组的首地址传送给了形参数组 4 形参数组也可以不指定大小 定义数组时在数组名后跟一个空的中括号 一般为了在被调用函数中处理数组元素个数的需要 可以另设一个整形变量作为另一个实参 专门传递需要处理的数组元素个数 5 应当注意 用数组名作为函数调用的实际参数时 不是将数组的值传递给形参数组 而是将实参数组的首地址传递给形参数组 此时 形参数组没有另外分配存储空间 而是和实参数组共用同一段内存单元 所以 在被调用函数中对形参数组中的值所作的改变 会直接修改实参数组的值 6 7变量的作用域 6 7 1变量的作用域变量的作用域也就是变量的作用范围 根据作用域 可以将变量分成两类 局部变量和全局变量 1 局部变量 局部变量也称为内部变量 他是在一个函数内部定义的 只在本函数内部有效 在此函数外部引用他是非法的 说明 1 主函数main中定义的变量只在主函数中有效 要想调用其他函数对主函数中的变量进行操作 如 调用一个判定素数的函数来判断主函数中某个变量的值是否素数 只能将主函数中的变量作为实参 在函数调用时将实参值传递给被调用函数的形参 然后对形参值进行判断 再将判断结果返回 而不能在被调用函数中直接使用主函数中的变量 同样 主函数也不能使用其他函数的变量 2 不同函数中可以使用相同名字的变量 它们代表不同的对象 互不干扰 3 形参也是局部变量 4 在一个函数内部 可以在复合语句中定义变量 这些变量仅在本复合语句中有效 2 全局变量全局变量是在函数外部定义的变量 他不属于任一个函数 可以为本程序中其他函数共用 全局变量作用范围是从变量定义的位置开始到本程序文件结束 在写程序时 一般不建议使用全局变量 如果在同一个程序文件中 局部变量和全局变量重名 则在局部变量的作用范围内 全局变量被 屏蔽 既不起作用 6 8变量的存储方式 局部和全局变量是依据变量的作用范围 从空间角度 来划分的 依据变量的存储方式 即变量的生存周期 变量又可以分两大类 静态存储变量和动态存储变量 静态存储变量 在变量定义时就分配固定的存储空间 程序执行过程中 该存储空间保持不变 直至程序运行结束 例如 全局变量 动态存储变量 在程序运行期间 这一类型变量是根据需要在使用时动态进行分配 使用结束立即释放的 例如 函数的形参 根据存储类别 变量的存储方式具体分为4类 auto static extern register 主要应用前两类 6 7 1auto自动变量一般定义在函数内部 没有专门声明为static存储类型的变量都是自动变量 在函数被执行时 被调用时 系统自动为该类变量分配存储空间 在函数调用结束后 又会自动释放这些存储空间 我们前面的定义在函数内部的变量和形参都是自动变量 自动变量的完整定义应是 auto变量类型名变量名 说明 1 自动变量在定义时 可以省略auto 2 自动变量都是定义在某个函数内部 是局部变量 反过来不一定正确 所以 自动变量作用域仅局限于变量定义的函数 6 7 2静态局部变量在函数内部的局部变量定义前加上static 该局部变量就被定义成静态局部变量 静态局部变量在使用时与自动变量有很大的区别 自动变量在函数的每次调用时 都重新动态分配存储空间 调用结束 释放所占存储空间 但静态局部变量在函数调用后 暂时不释放存储空间 而是将值保留下来 在下一次函数调用时继续使用 详见P125 6 9编译预处理 预处理命令是以 开头的行 在源程序中这些命令行都放在函数外面 且一般放在整个源程序的首部 这些命令在对程序编译 执行之前进行处理 C语言的编译预处理功能主要分三大类 宏定义 文件饱含 条件编译 我们主要学习前两类的使用 6 9 1宏定义 功能 用一个标识符来表示一个字符串 不带参数的宏定义 即以前介绍的符号常量定义 一般形式 define标识符字符串作用是用指定的标识符来代替某个字符串 在编译预处理时 对程序中在该命令后出现的标识符都用宏定义中的字符串替换 例题 P132 133程序执行过程 编辑源程序 编译预处理 编译连接 执行 例如 由键盘输入y值 计算表达式3 y2 3y 4 y2 3y y y2 3y 源程序为 defineM y y 3 y main ints y scanf d 编
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025北京海淀第十九中学教师招聘模拟试卷附答案详解(突破训练)
- 2025年西安经开第七小学招聘数学教师考前自测高频考点模拟试题及答案详解一套
- 2025福建武夷山市供销总公司招聘3人模拟试卷及答案详解(夺冠)
- 2025贵州黔西南州兴义民族师范学院高层次人才引进20人模拟试卷及答案详解参考
- 2025广东深圳市优才人力资源有限公司招聘编外聘用人员拟聘人员考前自测高频考点模拟试题及参考答案详解
- 2025年滁州明光市公开引进高中教育紧缺人才11人考前自测高频考点模拟试题及答案详解(必刷)
- 2025河南许昌市建安区人力资源和社会保障局招聘公益性岗位人员13人考前自测高频考点模拟试题及答案详解(夺冠)
- 2025广西南宁隆安县南圩镇杨湾卫生院医学影像专业招聘1人模拟试卷及答案详解(易错题)
- 安全培训教学图课件
- 安全培训救护小结课件
- 2025年成都市中考英语试题卷(含标准答案及解析)
- 专利代理机构管理制度
- 极简室内风格软装设计
- 压路机操作手入场安全教育试卷(含答案)
- 《非药物治疗多动症的方法和技能》记录
- 胖东来评定管理制度
- 产房考试试题及答案
- 重症自身免疫性脑炎监测与治疗中国专家共识(2024版)解读
- 供餐服务合同协议书模板
- 无偿搭车免责协议书
- 2025-2030年中国电力线载波通信芯片行业市场现状供需分析及投资评估规划分析研究报告
评论
0/150
提交评论