已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
16 27 1 49 第1章函数与宏定义 1 1函数概念 1 2变量作用域和存储类型 1 3内部函数与外部函数 1 4递归函数的设计和调用 1 5预处理 1 6综合范例 16 27 2 49 1 1函数概念 C语言中 函数可分为两类 一类是由系统定义的标准函数 又称为库函数 其函数声明一般是放在系统的include目录下以 h为后缀的头文件中 如在程序中要用到某个库函数 必须在调用该函数之前用 include命令将库函数信息包含到本程序中 另一类函数是自定义函数 16 27 3 49 1 1 1函数定义 存储类型符 返回值类型符 函数名 形参说明表 函数语句体 16 27 4 49 说明 1 存储类型符 指的是函数的作用范围 它只有两种形式 static和extern static说明函数只能作用于其所在的源文件 用static说明的函数又称为内部函数 extern说明函数可被其它源文件中的函数调用 用extern说明的函数 又称为外部函数 缺省情况为extern 2 返回值类型符 指的是函数体语句执行完成后 函数返回的值的类型 如int float char等等 若函数无返回值 则用空类型void来定义函数的返回值 缺省情况为int型 16 27 5 49 3 函数名由任何合法的标识符构成 建议将函数名的命名与函数内容有一定关系 4 形参说明表 是一系列用逗号分开的每个形参变量说明 如 intx inty intz这表示形参变量有三个 x y z 它们的类型都是int型 5 函数语句体是放在一对花括号 中 由局部数据类型描述和功能实现两部分组成 16 27 6 49 6 函数返回语句的形式有以下两种 函数无返回值的情况 return 或者什么也不写 函数有返回值的情况 return 表达式的值 在第 种情况下要注意 表达式的值 的类型必须与函数返回值的类型相一致 例如 求两个任意整数的绝对值的和 用函数abs sum 实现 直接调用库函数来计算m和n的绝对值 intabs sum intm intn return abs m abs n 函数abs 是在头文件math h中声明的 16 27 7 49 函数定义如下 intabs sum intm intn if m 0 m m if n 0 n n return m n 1 1 2函数声明和调用 1 函数的声明函数声明的一般形式 存储类型符 返回值类型符 函数名 形参说明表 如 intabs sun intm intn 16 27 8 49 2 函数调用函数调用是通过函数调用语句来实现的 分两种形式 无返回值的情况 函数名 实参表 有返回值的情况 变量名 函数名 实参表 该变量名的类型必须与函数的返回值类型相同 函数调用时都会去执行函数语句中的内容 函数执行完毕后 回到函数的调用处 继续执行下面的语句 16 27 9 49 1 1 3函数的传值方式 函数的传值方式 采用实参表将每一个实参的值相应地传递给每一个形参变量 形参变量在接收到实参表传过来的值时 会在内存临时开辟新的空间 以保留形参变量的值 当函数执行完毕时 这些临时开辟的内存空间会被释放 并且形参的值在函数中不论是否发生变化 都不会影响到实参变量的值的变化 这就是函数的传值方式 自定义函数在程序中的使用顺序有两种形式 先进行函数声明 再进行函数调用 函数定义放在函数调用之后 函数声明在函数调用之前 函数定义放在函数调用之前 16 27 10 49 例1 1 编程序 通过调用函数abs sum 求任意两个整数的绝对值的和 exam1 1 c调用函数求两整数绝对值的和 includeintabs sum intm intn main intx y z scanf d d 程序运行结果 712 sumis19 16 27 11 49 用传值方式调用函数时 实参也可以是函数调用语句 例1 2 求任意三个数的绝对值的和 exam1 2 c调用函数求三个整数绝对值的和 includeintabs sum intm intn main intx y z sum scanf d d d 程序运行结果 7125 sumis24 16 27 12 49 注意 对于有返回值的函数 调用时若没有把它赋给某个变量 仍然是可以的 只是函数的返回值有可能会被丢失 例1 3 求任意两数的乘积 自定义一个函数mul 用于求两数的乘积 程序 exam1 3 c求两个数的乘积 includefloatmul floata floatb main floatx y z scanf f f 16 27 13 49 x x 2 y y 2 printf z f mul f f f n z x y mul x y floatmul floata floatb returna b 程序运行结果 56 z 30 000000 mul 30 000000 8 000000 240 000000 16 27 14 49 程序说明 注释 处调用函数后的返回值赋给变量z 注释 处调用函数后的返回值没有赋给任何变量 函数的返回值被丢失 注释 处调用函数后的返回值成为了printf 函数的参数 16 27 15 49 1 2变量作用域和存储类型 1 变量的作用域 变量的作用域 指的是变量的有效范围 针对变量不同的作用域 可把变量分为局部变量和全局变量 局部变量 在函数内部或某个控制块的内部定义的变量为局部变量 局部变量的有效范围只限于本函数内部 退出函数 该变量自动失效 全局变量 在函数外面定义的变量称为全局变量 全局变量的作用域是从该变量定义的位置开始 直到源文件结束 在同一文件中的所有函数都可以引用全局变量 16 27 16 49 局部变量和全局变量的作用域如图所示 16 27 17 49 例1 4 变量作用域应用举例 阅读下面的程序 注意区分局部变量和全局变量的作用域 exam9 4 c变量作用域举例 includevoida void voidb void voidc void intx 1 main intx 5 printf localxinouterscopeofmainis d n x 16 27 18 49 intx 7 printf localxininnerscopeofmainis d n x printf localxinouterscopeofmainis d n x a b c a b c 前三次输出结果 localxinouterscopeofmainis5localxininnerscopeofmainis7localxinouterscopeofmainis5 16 27 19 49 printf localxinmainis d n x getchar return0 voida void intx 25 printf nlocalxinais dafterenteringa n x x printf localxinais dbeforeexitinga n x 16 27 20 49 voidb void staticintx 50 printf nlocalstaticxis donenteringb n x x printf localstaticxis donexitingb n x voidc void printf nglobalxis donenteringc n x x 10 printf globalxis donexitingc n x 16 27 21 49 程序运行结果 后6次函数调用 localxinais25afterenteringalocalxinais26beforeexitingalocalstaticxis50onenteringblocalstaticxis51onexitingbglobalxis1onenteringcglobalxis10onexitingclocalxinais25afterenteringalocalxinais26beforeexitingalocalstaticxis51onenteringblocalstaticxis52onexitingbglobalxis10onenteringcglobalxis100onexitingc 最后一次输出 localxinmainis5 16 27 22 49 2 变量的存储类型 变量的存储类型 指的是变量的存储属性 它说明变量占用存储空间的区域 在内存中 供用户使用的存储区由程序区 静态存储区和动态存储区三部分组成 变量的存储类型有四种 auto型 register型 static型和extern型 auto型变量存储在内存的动态存储区 register型变量保存在寄存器中 static型变量和extern型变量存储在静态存储器 16 27 23 49 局部变量的存储类型缺省值为auto型 全局变量的存储类型缺省值为extern型 auto型变量和register型变量只用于定义局部变量 static型变量即可定义成局部变量 又可定义成全局变量 例1 5 设计一个函数 longfac intn 可用来计算1 5的阶乘 分析 可在函数中定义一个static型变量 用来保存上次的计算结果 16 27 24 49 exam1 5 c用static型变量保留上次阶乘的值 includelongfac intn staticintf 1 f f n returnf main inti for i 1 i 5 i printf d ld n i fac i 程序运行结果 1 12 23 64 245 120 局部变量f被定义成static型的 因此 它只在该函数第1次被调用的时候初始化其值为1 以后再调用该函数时 不再进行初始化 而是使用上一次调用的值 16 27 25 49 1 3内部函数与外部函数 1 内部函数 若函数的存储类型为static型 则称其为内部函数或称静态函数 它表示在同一个程序中 由多个源文件组成 该函数只能在一个文件中存在 在其它文件中不可使用 如 staticintfun name 内部函数只能被其所在的源文件调用 2 外部函数 若函数的存储类型定义为extern型 则称其为外部函数 它表示该函数能被其它源文件调用 函数的缺省存储类型为extern型 注意 在需要用到外部函数的文件中 其函数声明必须用extern进行说明 16 27 26 49 例如 有两个源文件file1 c和file2 c如下所示 file1 c调用外部函数 includeintmod inta intb externintadd intm intn 外部函数声明 main intx y result scanf d d 16 27 27 49 intmod inta intb return a d file2 c外部函数 externintadd intm intn return m n 说明 1 在文件1 file1 c 中的函数声明 intmod inta intb 实际上相当于 externintmod inta intb 16 27 28 49 2 在文件2 file2 c 中的函数定义 externintadd intm intn return m n 实际上相当于 intadd intm intn return m n 3 由多个源文件组成一个程序时 main 函数只能出现在一个源文件中 16 27 29 49 4 多个源文件的连接方式有三种 将各源文件分别编译成目标文件 得到多个目标文件 obj后缀 然后用连接命令 tlink 把多个 obj文件连接起来 在Turboc上用如下命令 tlinkfile1 obj file2 obj filen obj生成一个file1 exe的可执行文件 建立项目文件 prj后缀 具体操作可参阅各种C编译手册 使用文件包含命令 16 27 30 49 1 4递归函数设计和调用 C语言中一个函数中的语句可以是对另一个函数的调用 函数嵌套调用图例 调用过程按图中箭头所示的方向和顺序进行 属于一种线性调用关系 每次调用后 最终返回到原调用点 继续执行以下语句 16 27 31 49 C语言中还允许在函数中调用自身 或函数之间相互调用 这种调用方式称之为递归 递归又分为直接递归调用和间接递归调用 直接递归调用 函数直接调用自身 间接递归调用 函数互相调用对方 直接递归 inttemp intx inty z z temp y 16 27 32 49 间接递归 显然 递归有可能陷入无限递归状态 最终导致错误发生 因此 设计一个递归问题必须具备两个条件 1 后一部分与原始问题类似 2 后一问题是原始问题的简化 16 27 33 49 例1 6 编程 从键盘输入一个正整数n 求n n 的数字表达式为 n 定义一个求n 的函数 longfac intn longfac intn longresult if n 0 n 1 result 1 elseresult n fac n 1 return result 16 27 34 49 完整程序如下 exam1 6 c用递归法求n includelongfac intn longresult if n 0 n 1 result 1 elseresult n fac n 1 returnresult main intx longf 16 27 35 49 scanf d 程序运行结果 6 6 720 16 27 36 49 例1 7 求Fibonacci数列第i项的值 Fibonacci数列 0 1 1 2 3 5 8 13 21 其数字表达式为 fibonacci 0 0fibonacci 1 1fibonacci n fibonacci n 1 fibonacci n 2 n 1 设计一个函数 longfibonacci intn 用于计算数列中第n项的值 16 27 37 49 程序如下所示 exam1 7 c求第n项Fibonacci数列的值 includelongfibonacci intn main intx 0 longresult do result fibonacci x printf fibonacci d ld n x result scanf d 16 27 38 49 longfibonacci intn if n 0 n 1 returnn elsereturnfibonacci n 1 fibonacci n 2 程序运行结果 fibonacci 0 03 fibonacci 3 24 fibonacci 4 36 16 27 39 49 以x 4为例 下图说明了fibonacci函数是怎样计算fibonacci 4 的 图中把fibonacci简写成f 编译预处理 是C与其它高级语言的一个重要区别 它们主要是 宏定义文件包含条件编译 1 5预处理 1 不带参数的宏定义用指定的标识符 宏名 代表一串字符 define宏名字符串 1 5 1宏定义 例求正圆锥体的底周长 底面积和它的体积 definePI3 1415926 宏名PI用大写 行末无分号 main floatl s r v scanf f 进行宏定义时 可以引用已定义的宏名 层层置换 对程序中用双引号括起来的字符串 即使与宏名相同 也不会被置换 宏名的有效范围为该宏定义命令之后至本源文件结束 通常 宏定义命令一般写在文件开头或函数之前作为该文件的一部分 可以用 undef命令终止宏定义的作用域 如 defineG9 8main undefGfloatf G的作用范围 2 带参数的宏定义 语句形式 define宏名 形参表 字符串 注意 字符串应包含形参表中的参数例 definePI3 1415926 defineS r PI r rmain floata area a 3 6 area S a area 3 1415926 a a 但不会置换a为3 6 printf r f narea f n a area getch 若将area S a 改写成area S a 2 将置换为 area PI a 2 a 2 而不是 area PI a 2 a 2 若要达到后者 则应将宏定义命令改写为 defineS r PI r r 宏名与括号之间不得有空格 因为宏名与表达式之间的分隔符为空格 如果用 defineS r PI r r的话 则被置换为area r PI r r a 宏展开并不进行值的传递 即不求表达式的值 也没有 返回值 的概念 宏不存在类型问题 宏名无类型 参数也无类型 表达式可以是任何类型 注 这里的t展开后为t a b c d a b c d 如果第一行写成 defineMAX x y x y x y则这里的t展开后为t a b c d a b c d因为置换展开是用 表达式 对等的置换 形参表 中的参数 定义带参数的宏 可以实现一些简单的函数功能 如 defineMAX x y x y x y main inta b c t t MAX a b c d 1 5 2 文件包含 用 include命令实现一个文件包含另一个文件 语句形式 include 文件名 例 include stdio h defineN2 defineMN 1 defineNUM M 1 M 2main inti n 0 for i 1 i NUM i n printf 2d n getch 输出结果 12345678 一个include命令只能指定一个被包含文件 如果要包含n个文件 则要用n个include命令 NUM被代换展开后为 2 1 1 2 1 2 include命令中 文件名既可用双引 号 推荐 也可用尖括号括起来 表示被包含在标准目录中 include 表示被包含文件在指定目录中 若只有文件名不带路径 则在当前目录中 若找不到 再到标准目录中找 包含文件名可以是 c源文件或 头文件 如 include include myhead h include D myexam myfile c 条件编译语句形式 1 ifdef宏名程序段1 else程序段2 endif作用 如果宏名已定义 则编译 程序段1 否则编译 程序段2 所谓 宏名已定义 是无论 宏名 定义为什么内容 条件编译的作用 缩短编译时间 减少目标程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软装设计师职业发展路径回顾与总结
- 新能源汽车常见故障识别与处理技巧
- 产品市场进入策略与竞争分析计划
- 预算管理制定和执行企业预算的好用指南-预算管理
- 厂务系统优化报告
- 酒店总经理客户服务质量提升方案策划书
- 海洋探索的助手中国海洋注册工程潜水员的工作规划
- 幼儿园收体测费通知书
- 广瑞公寓停电通知书
- 延川县中学开学通知书
- 2025-2030老年营养餐市场空白与产品开发建议
- 2025年党建知识竞赛题及答案
- 2025-2026学年人教版(2024)数学七年级上册期中测试卷
- 2025年全员安全培训考试试题含答案(基础题)
- 2025浙江绍兴市应急管理局招聘编外人员1人考试参考试题及答案解析
- 酒店员工礼仪培训
- 2025-2030智慧海洋行业市场研究及投资潜力评估报告
- 餐饮用电安全常识培训课件
- 安全生产巡查办法
- 天然气销售常识知识培训课件
- 军人心理适应知识培训课件
评论
0/150
提交评论