




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章程序结构 程序由什么组成 答案1 程序由代码语句组成 正是一行行的代码 组成了一个完整的程序 答案2 程序由函数组成 一个个函数之间的互相调用 最终构建出一个完整的程序 答案3 程序由文件组成 7 1源文件和头文件 扩展名为 cpp的文件 主要用以实现程序的各种功能 存放函数或数据定义 我们称为源文件或代码文件 扩展名为 h的文件 称为头文件 在头文件里主要写一些函数 数据 包括数据类型的定义 的声明 这样可以在多个 c或 cpp文件内共享这些函数 数据 头文件可以起到 名片夹 的作用 可以通过 file new 菜单来为某一工程创建不同类型的文件 创建多个源文件 示例 编程对给定的正整数n求 1 2 n 分析 采用多函数 多文件的形式 main cpp mainfunc cpp assifunc cpp voidmain intn validate n qiuhe n intjiecheng intn intqiuhe intn voidvalidate intn test1 main cpp includeusingnamespacestd voidmain intn cin n validate n intb qiuhe n cout 从1加到 n 的阶乘是 b endl mainfunc cpp intjiecheng intk 阶乘函数定义 求k的阶乘 intmult 1 for inti 1 i k i mult i returnmult intqiuhe intn 求和函数定义 求1到n的阶乘之和 intsum 0 for inti 1 i n i sum jiecheng i returnsum assifunc cpp voidvalidate intn 有效性检查函数定义 if n 0 return else cout 输入的数据不是正整数 正在结束程序 exit 0 解决方法1 需要在main cpp中main函数前添加被调函数的声明voidvalidate intn intqiuhe intn voidmain 需要在assifunc cpp中添加 includeusingnamespacestd 解决方法2 将所有被调函数的声明做成一个头文件然后需要在main cpp中添加 include assifunc h voidvalidate intn intqiuhe intn assifunc h include预编译指令 预编译 指示C 编译器在正式编译前作些准备工作 预编译指令都以 开头 include指示预编译将包含的头文件的内容附加在程序文件中 以参加编译 如果头文件是C 系统提供的 则位于系统默认路径下 需用尖括号把头文件括起来 如 include如果是自定义的头文件 则位于当前路径下 需用双引号把头文件括起来 如 include mainfunc h 区别 编译器的路径搜索的顺序不同 先到当前路径下找 找不到时到系统默认路径下找 直接到系统默认路径下找 找不到时提示出错 需要注意的是 用 include包含了相应的头文件 编译步骤可以通过 但若相应的工程路径下没有包含函数定义的源文件 连接步骤会报错 试验删除mainfunc cpp 在一个头文件中可以用include另一个头文件 这会产生一个问题 在编译一个程序文件时 重复包含同一个头文件 errorC2374 a redefinition multipleinitialization test2 头文件卫士 避免头文件嵌套包含而带来的重复定义问题的办法是在头文件中增加一组条件编译指令 ifndef define endif week h ifndefWEEK defineWEEKinta 10 endif ifndefWEEK defineWEEKinta 10 endif voidmain include展开 7 2全局数据 局部变量 在函数体中的定义的变量为局部变量局部变量在程序运行时 随着函数的调用 被建立在栈上 未经初始化时其值是不确定的 函数调用一返回 它也跟着消亡 全局数据 就是在任何函数的外部声明或定义的 在程序范围内可以访问的数据 示例 编程对给定的正整数n求 1 2 n main cpp mainfunc cpp assifunc cpp voidmain intn validate n qiuhe n intjiecheng intk intqiuhe intn voidvalidate intn 2个函数都是对main函数中传递进来的参数n进行分析处理 此处能否采用全局数据 使得函数免于参数传递 main cpp mainfunc cpp assifunc cpp intn voidmain validate qiuhe intjiecheng intk intqiuhe voidvalidate 但是 编译程序 E test assifunc cpp 7 errorC2065 n undeclaredidentifierE test mainfunc cpp 12 errorC2065 n undeclaredidentifier 解决方法1 所有的函数都写在文件main cpp中解决方法2 仍采用多文件结构 在mainfunc cpp和assifunc cpp中声明n main cpp intn voidmain cin n validate qiuhe externintn intqiuhe mainfunc cpp 定义全局变量n 声明全局变量n 同样地 还需在assifunc cpp中也声明n externintn voidvalidate if n 0 return else 通过定义和声明全局数据 可以实现在多文件中共享数据 全局变量声明语句可以多次出现 但只能定义一次 看看会发生什么 同一工程中的两个文件中定义同名全局变量n时 会发生什么问题 同一工程中的多个源文件中只有extern声明全局变量n 但无n的定义语句时 会发生什么问题 extern使用规则 写成初始化形式的全局数据声明 如 externintn 8 编译将忽视extern全局变量声明与定义时类型不一致 如 intn 8 file1 cppexterndoublen file2 cpp 不同的编译器有不同的行为 VC会指出 未定的外部名 unresolvedexternal 错误 BC不能发现该错误 全局数据利与弊 全局数据位于全局数据区 若定义时没有初始化 则默认初始化为0 全局数据因为置身于所有函数之外 可以起到所有函数都能造访它的作用 因此 对于大多数函数都要访问某个数据的情形时 将它设置为全局的 可以免于参数传递 全局数据破坏了模块结构的独立性 牵扯了各个模块 使其无法独立 消去全局数据 使用函数参数传递 应多多练习函数之间用参数传递数据的常规形式 尽量避免使用全局数据 思考 将validate函数写在main cpp文件中 可不可以设计一个全局变量 只在main cpp文件中被其中的所有函数共享 而对其他文件 如mainfunc cpp来说不能共享 staticintn 使用static关键字可以定义这样的全局数据 7 3静态数据 标以关键字static的数据称为静态数据 分为静态全局数据和静态局部数据两类 另外 也可以定义静态函数 为了使程序文件发挥模块的作用 有必要定义只属于这种模块的局部量 它独立于其他程序文件 但也是定义在任何函数之外 位于全局数据区 默认初始值为0 称之为静态全局数据 也称全局静态数据 变量定义前加上static关键字 就可以定义静态全局变量 如 staticintn 10 静态全局数据是仅在一个程序文件中共享的数据 而全局数据则是在所有声明过它和定义过它的多个程序文件中共享的数据 静态全局数据 函数声明 定义 前加上static 如 staticvoidfunc 静态全局函数 表示validate函数局部于程序文件main cpp 它只能被main cpp文件中的其它函数调用 只服务于本文件 在定义局部变量前加上static 静态局部变量 voidfunc staticinta 2 静态局部变量 仍然在函数体中定义 但需加关键字static voidfunc staticinta 2 intb 5 a 2 b 5 cout a a b b endl voidmain func func 运行结果 a 4 b 10a 6 b 10 思考 为什么要定义静态局部变量 它和局部变量本质区别在哪 test3 对静态局部变量的理解 静态局部变量位于全局数据区 未经初始化时其值为0 它不会受函数的调用和返回的影响 因为函数调用与返回过程是在栈上进行的 全局数据区与栈区是程序进程空间中两片不同的内存区域 互不干涉 函数第一次被调用时 静态局部变量被建立 以后该变量一直存在 直到程序运行结束 所以我们可以说静态局部变量是在屡次调用的同一个函数中共享的数据 静态局部变量的初始化语句只会执行一次 下列程序运行后屏幕显示输出的第一行是 第二行是 includeusingnamespacestd voidf int 8 34 静态局部变量利与弊 利 确定函数是否被调用过 以及被调用的次数 voidfunc staticinta a 弊 静态局部变量的存在降低了程序的可读性 当调用次数多的时候往往弄不清楚它的当前值是什么 建议 如不必要 不要使用 7 4作用域 可见性和生命期 从空间的角度 指明变量 标志符 在某个范围内是有效的 能发挥其作用 作用域开始于变量的声明处 结束位置决定于变量类型 作用域 常用的C 作用域类型 文件作用域 全局作用域 自声明处至源文件结束函数原型 声明 作用域 函数声明的括号范围内 如 intmax inta intb a 3 错误 a没有定义函数声明时的形参与上下文无关 可以省略变量名 intmax int int 但建议写上 并保持与函数定义时的形参名一致 增强可读性 局部作用域 当标志符的声明出现在一对 括起来的一段程序块里时 该标志符的作用域从声明点开始 到该块结束处的 为止 该作用域称之为局部作用域 回顾 哪些地方用到 if switch while for 函数定义体思考 局部作用域中 语句块往往是嵌套的 出现同名变量 标志符 怎么办 voidfunc inty y为函数声明作用域 仅此语句有效intj 8 j为全局作用域 在整个文件中有效voidmain intx x为局部作用域 自此开始作用 cin x func x x作用域结束voidfunc inty y的作用域开始inti y i为局部作用域 自此开始作用if i j inti 10 本块中 i作用域开始 而上文定义的i在此处不能用cout i i y y j j endl elsecout i i 2 endl 可见性 在作用域范围内如果该变量可以被使用 则又称变量在此作用域内是可见的 变量在其作用域中并非一定可见 能被引用 如果遇到离得更近的变量定义 则另一个离得远些的同名变量定义会被暂时屏蔽 而变得不可见 全局变量被屏蔽时可通过加 重见天日 inta 3 voidfn inta 5 inta 7 cout a n cout a n 怎么打印fn函数一进来的那个a呢 名空间 解决类似的名字冲突的方法是引入名空间机制 所有名字都有空间
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年特种作业类金属非金属矿山安全作业金属非金属矿山爆破作业-尾矿作业参考题库含答案解析
- 2025年特种作业类危险化学品安全作业生产经营从业-氟化工艺作业参考题库含答案解析
- 2025年磁性载体材料项目规划申请报告模板
- 2025年特种作业类危险化学品安全作业加氢工艺作业-硝化工艺作业参考题库含答案解析
- 南昌新建区中考数学试卷
- 2025年学历类自考公共课数论初步-思想道德修养与法律基础参考题库含答案解析
- 老师改期末数学试卷
- 猫咪收纳游戏数学试卷
- 2025年初级会计师职称考试模拟题集
- 2025年学历类自考专业(法律)国际法-税法参考题库含答案解析
- 2025年内江市总工会公开招聘工会社会工作者(14人)笔试模拟试题及答案解析
- 2025云南辅警笔试题目及答案
- 2025四川内江市总工会招聘工会社会工作者14人笔试备考试题及答案解析
- 2025年三支扶陕西试题及答案
- 2025年行政执法证考试必刷题库与答案
- 基孔肯雅热防控知识考试试题含答案
- 低钾血症护理常规业务学习
- 2025年职业指导师(四级)考试模拟试题汇编与模拟试题解析
- 2025年新修订《治安管理处罚法》
- 【政治 云南卷】2025年云南省高考招生统一考试真题政治试卷(含答案)
- 测听讲课的课件
评论
0/150
提交评论