已阅读5页,还剩144页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C 程序设计 第2版 作者 戴仕明 赵传申等建议课时 64学时 第1章第2章数据类型第3章运算符和表达式第4章C 的基本语句第5章函数和编译预处理 第1章 C 概述 本章主要内容 1 1程序设计概述1 2从C到C 1 3简单的C 程序介绍1 4C 程序的开发步骤1 5VC 程序的上机过程 1 1程序设计概述 1 1 1程序设计方法1 1 2程序设计语言 1 1 1程序设计方法 程序设计是一个创新的过程 编写的程序由两个主要方面组成 算法的集合 就是将指令组织成程序来解决某个特点的问题 数据的集合 算法在这些数据上操作 以提供问题的解决方案 目前常用的程序设计方法主要包括结构化程序设计 面向对象程序设计及泛型程序设计 1 结构化程序设计结构化程序设计 StructuralProgramming 是一种以功能为中心 基于功能分解的程序设计方法 一般采用自顶向下 逐步求精的方法 将一个复杂的系统功能逐步分解成由许多简单的子功能构成 然后分别对子功能进行编程实现 公式 1 1 描述了结构化程序的本质特征 程序 算法 数据结构 1 1 公式 1 1 中的算法是对数据的加工步骤的描述 而数据结构是对算法所加工的数据的描述 2 面向对象程序设计一个面向对象的程序由一些对象构成 对象是由一些数据及可施于这些数据上的操作所构成的封装体 对象的特征由相应的类描述 一个类可以从其他的类继承 面向对象程序的执行过程体现为各个对象之间互相发送和处理消息 面向对象程序可以用公式 1 2 描述 程序 对象 类 对象 类 1 2 对象 类 数据 操作在面向对象程序设计中 把数据和对数据的操作封装在一起 对数据的操作必须通过相应的对象来进行 从而加强了数据的保护 对象在问题的求解领域是相对稳定的实体 由对象构成的程序能够适应软件需求变化 面向对象程序设计中软件的复用以类为单位 3 泛型程序设计简单地说 泛型程序设计 GenericProgramming 是一种将类型参数化的思维模式 面向对象关注的是程序的数据方面 而泛型程序设计关注算法方面 两者的侧重点不同 面向对象是一个用来管理和实现大型项目的工具 泛型程序设计一般提供实现通用任务的工具 如数据排序 其中的 泛 表示根据类型来产生代码 1 1 2程序设计语言 程序设计语言的发展总体上经历了低级语言和高级语言 其中 低级语言包括机器语言 汇编语言等 高级语言包括Fortran Basic Pascal Java C和C 等 1 机器语言计算机是不懂自然语言的 要让计算机解决问题 必须将问题以及解决问题的步骤利用计算机能够 听懂 的机器语言描述给它听 它才能帮助人们解决问题 这个过程就是编程 如图1 1所示 图1 1编程模型机器语言即是机器指令的集合 不同型号CPU的计算机都有自己的指令集合 如IntelCPU和AMDCPU能够识别的机器语言是不同的 2 汇编语言为了减轻使用机器语言编程的负担 人们进行了一种有益的改进 用一些简洁的英文字母 符号串来替代一个特定的指令的二进制串 这种程序设计语言就称为汇编语言 问题的汇编语言描述 汇编源程序 比机器语言描述容易理解 但是CPU是不懂汇编语言的 必须要使用某个翻译程序 通常称为汇编程序 将汇编源程序转换成机器能理解的机器语言 这个过程一般称为汇编 虽然汇编语言较机器语言已有很大的改进 但仍是低级语言 它有两个主要缺点 第一 涉及太多的机器硬件细节 第二 与具体的计算机相关 因为汇编语言中的指令基本和机器语言的指令一一对应 只是采用符号简化了程序员的记忆 3 高级语言为了进一步提高编程效率 改进程序的可读性 可维护性 又出现了许多高级语言 这些编程语言接近于数学语言或人的自然语言 同时又不依赖于具体的计算机硬件 编出的程序能在所有机器上通用 如Fortran Basic Pascal Java C和C 等 高级语言比低级语言更加抽象 简洁 其优点如下 1 一条高级语言的指令相当于几条机器语言的指令 2 用高级语言编写的程序同英语非常接近 易于学习 3 用高级语言编写程序并不需要某种计算机的专门知识 1 2从C到C C 是当今非常流行的一种支持结构化程序设计 面向对象程序设计及泛型程序设计的高级程序设计语言 它适合于作为系统描述语言 既可用来写系统软件 也可用来写应用软件 C语言是一种常规用途的语言 可用来写任何形式的程序 而UNIX操作系统直接促成了它的成功与普及 C语言的特殊性在于 它虽然是一种高级语言 但包含了低级语言的许多特点 C语言其实处在一种非常高级的语言和一种低级语言之间 其优点和缺点都很突出 类似于 低级 汇编语言 C语言程序可直接操纵计算机的内存 另一方面 C语言又具有高级语言的许多特点 所以比汇编语言更容易理解和编写 但对于其他程序 有时甚至包括一些系统程序 C语言并不像其他语言那样容易理解 另外 它不像另外一些高级语言那样提供了对自动检查的完善支持 为了解决上述问题以及C语言的另外一些缺陷 AT T贝尔实验室的BjarneStroustrup在20世纪80年代初开发了C C 并不是对C语言的功能作简单的改进和扩充 而是一种本质性革新 和C语言不同 C 具备了 面向对象编程 OrientedObjectProgramming OOP 的能力 再者 C 设计的程序具有扩充性强的特点 对于编写一些大的程序而言是非常重要的 1 3简单的C 程序介绍 对程序的基本结构及各语句的作用作以下几点说明 1 编译预处理指令 以 开头的行都称为编译预处理指令 2 主函数main 任何一个C 程序都要有一个且只能有一个主函数 其余的函数可有可无 一个程序的执行 不管该函数在整个程序中的什么位置 它总是从main 开始执行 其中 被称为函数或语句括号 它表示函数体的开始位置和结束位置 注意 花括号一定要配对使用 3 对程序的注释部分 在编写C 程序的过程中 为了增加程序的可读性 程序员通常要对所编写的程序进行文字注释 而C 程序的任何位置都可以插入注释信息 注释的方法共有两种 一种是用 来表示 它表示从此处开始到本行的结束为注释部分 另一种方法是用 和 把注释信息括起来 这种注释可以出现在程序中的任何位置 4 任一 程序均由一个或多个函数组成 主函数main是必不可少的 其余函数可有可无 通常 程序中用到的函数可以是库函数或用户自定义的函数 任一函数由若干个语句所组成 每一个语句均以 结束 5 程序的书写规则 按照C 的语法规则 程序的书写形式是自由的 可以将一个语句写成若干行 不能在一个基本语法单位之间换行 也可将若干个语句写在一行内 但规范风格的编码会对软件的升级 修改 维护带来极大的方便 为了方便程序的阅读和相互交流 程序的书写格式及源程序文件中的格式必须符合以下规则 关键词和操作符之间加适当的空格 相对独立的程序块与块之间加空行 较长的语句 表达式等要分成多行书写 划分出的新行要进行适应的缩进 使排版整齐 语句可读 长表达式要在低优先级操作符处划分新行 操作符放在新行之首 循环 判断等语句中若有较长的表达式或语句 则要进行适应的划分 若函数或过程中的参数较长 则要进行适当的划分 不允许把多个短语句写在一行中 即一行只写一条语句 函数或过程的开始 结构的定义及循环 判断等语句中的代码都要采用缩进风格 同一层次的语句必须从同一列开始 闭花括号与同一层次的开花括号对齐或与开花括号所在的语句对齐 也就是说编写程序块时 和 应各独占一行并且位于同一列 注释要简单明了 边写代码边注释 修改代码同时修改相应的注释 以保证注释与代码的一致性 在必要的地方注释 注释量要适中 避免使用不易理解的数字 用有意义的标识来替代 编程时要经常注意代码的效率 在保证软件系统的正确性 稳定性 可读性及可测性的前提下 提高代码效率 6 在C 中是没有专门的输入输出语句的 输入输出是通过输入输出流来实现的 其本质上是一个对象 7 严格区分大小写字母 在C 程序中 除注解中的字母外 是严格区分大小写字母的 如B与b表示两个不同的标识符 在输入源程序或编辑源程序时 读者一定要特别要注意这一点 8 程序带有 n 表示在这之后换行 否则接下来的输出会继续在同一行输出 在cout语句中使用 n 时 必须使用反斜杠 也就是 如果错误地写成 n 编译器不会给出错误消息 程序仍会运行 只是输出的内容可能与预期的不同 在程序中 n 表示转移字符 所以用单引号括起来 1 4C 程序的开发步骤 针对一个实际问题 用C 语言设计一个实用程序时 通常要经过以下7个开发步骤 1 用户需求分析 根据要解决的实际问题 分析用户的所有需求 确定编程的思路 并用合适的方法 工具进行详细描述 2 根据解题算法编写C 源程序 3 编辑源程序并保存 利用C 的集成环境或某一种文本编辑器将设计好的源程序输入到计算机的一个文件中 文件的扩展名为 cpp cpp是CPlusPlus的缩写 还有一种后缀为 h的源文件 称为头文件 headerfile 用来说明其他函数库提供的功能 4 编译源程序 并产生目标程序 计算机的CPU只能识别由0和1组成的二进制的机器语言指令 而不能识别使用高级语言编写的指令 如 result a b c d 因此 必须利用C 编译器 Compiler 也称为编译程序或编译系统 将编译好的源程序转换成二进制机器代码形式的目标文件 这个过程就是编译 目标文件的文件名通常为 obj object的缩写 在编译源程序文件时 若发生语法或语义错误时 要修改源程序文件 直到没有编译错误为止 编译后 为源程序产生了目标文件 5 将目标文件连接成可执行文件 一个C 程序中的代码可以分别放到多个源文件中 而每个源文件都是分别编译生成目标文件的 因此为了得到一个完整的可执行程序 必须通过一个连接程序 Linker 也称为连接器 把这些目标文件以及程序中用到的一些系统功能或其他第三方所提供的功能所在的目标文件 通常称为库文件 连接起来 最终形成一个可执行的二进制文件 可执行文件的后缀通常为 exe 6 运行调试程序 运行是让操作系统将某个可执行文件装入内存 运行其中的可执行代码 从而得到输出的结果 调试过程为运行可执行程序文件 分析运行结果 若运行结果不正确 则要修改源程序 并重复以上的过程 直到得到正确的结果为止 7 优化 进一步提高程序的运行效率 主要通过改进所用算法 缩短程序运行时间 通过合理分配使用内存 减少所用存储空间 1 5VC 程序的上机过程 1 5 1VC 程序开发环境介绍1 5 2在VC 6 0环境中开发VC 程序 1 5 1VC 程序开发环境介绍 通常 C 的集成环境约定 当源程序文件的扩展名为 c时 则为C程序 而当文件的扩展名为 cpp时 则为C 程序 在Windows操作系统下启动VC 6 0的集成环境 则产生如图1 4所示的一个组合窗口 最上面的部分为窗口标题栏 标题栏的下面是菜单栏 由图上我们可以看出有 文件 编辑 查看 插入 工程 工具 等菜单 菜单栏的下面为工具栏 有 打开 剪切 复制 粘贴 撤销 查找 等按钮 图1 4VC 6 0集成环境 该集成坏境的主体部分由3个子窗口组成 左边的子窗口为工作区窗口 它的标签页可以按资源 类或者文件格式快速定位并显示程序 右边的子窗口为程序编辑窗口 用于输入或编辑源程序代码 下边的子窗口为输出信息窗口 用来显示出错信息或调试程序的有关信息 一般程序一次不成功时可以根据这个窗口的信息来修改源程序 它是一个信息的反馈 在最下方的是状态栏 用于操作时信息的实时显示 1 5 2在VC 6 0环境中开发VC 程序 1 创建项目在主界面中的 文件 菜单下选择 新建 命令 进入创建新项目的向导对话框 首先要确定项目的类型 名称和位置等信息 如图1 5所示 图1 5输入项目信息 1 打开 工程 选项卡 选中项目类型为Win32ConsoleApplication 2 在 工程名称 文本框中输入项目名 3 在 位置 文本框中输入项目的存储位置 4 选中 创建新的工作空间 单选按钮 表示要创建新的工作空间 5 单击 确定 按钮 弹出如图1 6所示的向导对话框 用来确定框架代码的组成 图1 6确定项目框架代码 6 在如图1 6所示的向导对话框中 自动生成源代码选项中的每个选项都可以控制VC 6 0自动生成一些不同的框架性的源代码 读者可以自行选择不同的选项 观察最后生成的代码有何不同 现在选中 一个空工程 单选按钮 单击 完成 按钮 项目目录创建完毕 7 接下来再次选择 文件 菜单下的 新建 命令 打开 新建 对话框并切换到 文件 选项卡 选中文件类型为C SourceFile 如图1 7所示 图1 7新建C 源文件 8 在 文件名 文本框中输入文件名 9 选中 添加到工程 复选框 表示要新建的C 源文件添加到工程中 下面的文本框中默认显示为前面新建的工程名称 10 在 位置 文本框中默认填写前面新建工程时的存储位置 11 单击 确定 按钮 如图1 8所示 生成可编辑的工程环境 至此 项目创建完毕 图1 8项目创建完毕 2 编辑源代码第一步完成后 便可以进行代码的编写了 打开图1 9中的ClassView选项卡 将显示项目中所有的函数列表 双击某个函数名 VC 6 0将在编辑区把该函数所在的源文件打开 并显示在最上面 成为活动源文件 同时定位到该函数 以便修改 图1 9编辑源程序 3 编译源程序打开FileView选项卡 双击HelloWorld cpp文件 将其设置为编辑区中的活动源文件 打开 组建 菜单 选择 编译 命令 4 创建可执行文件打开 组建 菜单 选择 组建 命令 VC 6 0自动连接所有的目标文件 生成可执行文件 5 运行程序在编译和连接完成后 可以选择 组建 菜单下的 执行 命令或按快捷键Ctrl F5来运行程序 6 调试程序程序在开发过程中 不可能一次性编写出正确的程序 需要反复调试 第2章 数据类型 本章主要内容 2 1基本数据类型2 2常量2 3变量 2 1基本数据类型 2 1 1关键字2 1 2标识符2 1 3标点符号2 1 4分隔符2 1 5C 的基本数据类型 2 1 1关键字 在C 语言中 关键字 keyword 或者保留字是指系统预先定义的 已经具有特殊含义和用途的英文单词 因此不允许用户重新定义 即不能作为新的标识符出现在程序中 下面我们对常用的关键字简单介绍如下 描述存储属性的有 auto extern Static register 描述数据类型的有 char int float double void struct union enum long short signed unsigned 描述语句的有 goto if else switch case default break for do while continue return 描述访问方式的有 const 常量修饰符 volatile 易变量修饰符 描述编译状态的有 sizeof 描述数据类型定义的有 typedef 2 1 2标识符 标识符是以大小写字母或下划线开始的字母 数字及下划线组成的字符序列 不能与关键字同名 C 语言中构成标识符的语法规则如下 1 标识符由字母 a z A Z 数字 0 9 或下划线 组成 不能含有空格 标点符号和其他字符 2 第一个字符必须是字母或下划线 3 标识符的有效长度取决于具体的C 编译系统 VC 中标识符最多由247个字符组成 一个有效的标识符的长度为1 247个字符 当标识符的长度超过247个字符时 其前面的247个字符有效 而其后的字符无效 4 在标识符中 严格区分大小写字母 例如 book和Book是两个不同的标识符 5 关键字不能作为自定义的标识符在程序中使用 但自定义的标识符中可以包含关键字 如intx myclass是合法的标识符 2 1 3标点符号 在C 程序中 标点符号对编译器具有语法意义 它们本身并不表示任何操作 C 语言中的标点符号有10个 及 其中 逗号用作数据之间的分隔符 分号作为语句结束符 冒号用作语句标号结束符 单引号作为字符常量标记符 双引号作为字符串常量标记符 左花括号为复合语句开始标记符 右花括号为复合语句结束标记符 左 右圆括号改变表达式的运算顺序 省略号表示重复 2 1 4分隔符 在C 中 分隔符的主要作用是分隔两个相邻的常量和 或 标识符 表示前一语法实体的结束和另一个语法实体的开始 空白 可以是空格字符 新行符 制表符 大括号用做表示数据集合和语句集合 用一对大括号围起的数据集合常用来为数组元素赋初值 用一对大括号围起的语句集合称为块语句 块语句可用做函数体或复合语句 作为分隔符的小括号用在控制语句 括号左边是关键字 函数调用和定义 括号左边是标识符 中 逗号用来在表列中分隔变量和在函数定义中分隔函数的参数 分号用来分隔语句 所以 分号是语句的标志 注解括号 注解的一般形式是 注解正文 2 1 5C 的基本数据类型 在C 中数据类型分为两大类 基本数据类型和导出数据类型 基本数据类型是C 中预定义的数据类型 C 语言的基本数据类型有5种 整数类型 int 浮点类型 单精度型float 双精度型double 长双精度型longdouble 字符类型 char 布尔类型 bool 和空类型 void 1 整型整数类型简称整型 用于定义整数对象 如1 10 1024 34等 整型用int表示 整型数据在内存中以二进制形式存储 2 浮点型浮点类型简称浮点型也称实型 用于定义实数 如3 14 9 8 1 23等 计算机系统对浮点数的存储采用了IEEE754标准 在内部将一个浮点数转换成二进制形式的科学计数法 然后分别存储符号 指数和尾数部分 3 字符型字符类型简称字符型 用于定义字符型数据 字符是指用来书写和表达思想的符号 如英文字母 汉字 运算的符号等 4 布尔型布尔类型简称布尔型也称为逻辑型 在C 中用关键字bool表示 bool型的值只有两个 true和false 它们分别对应逻辑 真 和逻辑 假 5 空类型空类型也称空值型 表示无类型 C 中 空类型用关键字void表示 void类型描述了有关值的空集 变量不能说明为void类型 2 2常量 2 2 1整型常量2 2 2实型常量2 2 3字符型常量2 2 4字符串型常量2 2 5符号常量 2 2 1整型常量 整型常量即整数 包括长整数 long 短整数 short 有符号整数 int 和无符号整数 unsignedint C 中整型常量常用十进制 八进制或十六进制方式来书写 1 八进制整数八进制整数必须以0开头 即以0作为八进制数的前缀 数码取值为0 7 八进制数通常是无符号数 2 十六进制整数十六进制整数的前缀为0X或0 x 其数码取值为0 9 A F或a f 3 十进制整数十进制整数没有前缀 其数码取值为0 9 4 整型常数的后缀十进制无符号整常数的范围为0 65535 有符号数为 32768 32767 八进制无符号数的表示范围为0 0177777 十六进制无符号数的表示范围为0X0 0XFFFF或0 x0 0 xFFFF 如果使用的数超过了上述范围 就必须用长整型数来表示 长整型数是用后缀L或l来表示的 而无符号整数用后缀字符u或U表示的 l或L与u或U的组合表示无符号长整数 2 2 2实型常量 实型常量又称为实数 浮点数 它通常是带有小数点的 或者带有指数的 或者既带小数点又带指数的十进制数 C语言采用小数点区分浮点数和整数 如1 0是浮点数 而1是整数 实型常量有两种表示方法 1 小数形式 由正 可省略 负号 数字0 9和小数点组成 2 指数形式 由尾数 十进制小数 字母E或e 指数 十进制整数 三部分组成 标准的指数形式是 小数点的左侧只有一位数字 计算机的输出是按标准指数形式输出的 如果不加说明 实型常量为正值 否则 在常量前面使用负号 实型常量默认是double型 要表示float型 可加后缀F或者f 2 2 3字符型常量 用单引号括起来的字符称为字符型常量 它包括普通字符常量和转义字符常量 1 普通字符常量 用一对单引号将单个字符括起来构成普通字符常量 2 转义字符常量 转义字符常量是一种特殊表示形式的字符常量 它以 开头 后跟一些表示特殊含义的字符序列组成 2 2 4字符串型常量 字符型数据只能是一个字符 并用 括起来 那么C 语言采用字符串的形式来表示意义的多个字符的组合 就是使用一对双引号 括起来0个或多个字符组成的字符序列 任何字母 数字 符号和转义字符都可以组成字符串 字符串常量与字符常量的区别是 1 书写格式不同 字符常量用 而字符串常量用 2 表现形式不同 字符常量是单个字符 字符串常量时一个或多个字符序列 3 存储方式不同 字符常量占用一个字节 字符串常量占用一个以上的字节 字符串的长度多一个 2 2 5符号常量 在C 中有两种定义符号常量的方法 一种是用编译预处理指令 另一种是用常量说明符const来定义 其中 用第一种方法来定义的例子如下 defineN abc defineKEY20080808用第二种方法来定义的例子如下 constfloatkey 20080808 要在程序中引用符号常量 必须先定义后引用 而且不能改变其值 2 3变量 2 3 1变量的命名2 3 2变量的声明2 3 3变量的赋值2 3 4变量的初始化2 3 5常数型变量 2 3 1变量的命名 通常变量名由作用域前缀 类型前缀 一个 或多个 单词组成 对于某些用途简单明了的局部变量 也可以使用简化的方式 如i j k x y z 作用域前缀 作用域前缀标明一个变量的可见范围 作用域可以有以下几种 前缀说明无局部变量m 类的成员变量 member sm 类的静态成员变量 staticmember s 静态变量 static g 外部全局变量 global sg 静态全局变量 staticglobal gg 进程间共享的共享数据段全局变量 globalglobal 除非不得已 否则应该尽可能少使用全局变量 类型前缀 类型前缀标明一个变量的类型 可以有以下几种 前缀说明i整型 int s短整型 shortint l长整型 longint u无符号 unsigned sz以 0 结束的字符串d双精度 double n整型和位域变量 number e枚举型变量 enumeration c字符型变量 char b布尔型变量 bool f浮点型变量 float a数组fn函数ld长双精度 longdouble p指针型变量和迭代子 pointer pfn特别针对指向函数的指针变量和函数对象指针 pointeroffunction 2 3 2变量的声明 声明语句的功能是定义变量的名称和数据类型 为C 编译系统给该变量分配存储空间提供依据 语句格式为 类型说明符变量表 其中类型说明符可以是int long short unsigned float double char 也可以是构造类型 变量表是想要声明的变量的名称列表 C语言允许在一个类型说明符之后同时说明多个具有相同类型的变量 此时各个变量名之间要用逗号 分隔开 2 3 3变量的赋值 变量的赋值就是给变量赋予一个新的值 对变量进行赋值是可以在程序的任何地方的 但最好要按照变量的数据类型来赋予相应类型的值 如果没有按相应的数据类型进行赋值 则编译器会按照一套强制转换规则来进行转换 如果不符合强制转换规则 则编译器会报错 变量的赋值要使用赋值语句来完成 2 3 4变量的初始化 在C 语言中允许在变量声明的同时对变量进行赋值 称为变量的初始化 在程序设计中常常需要对变量赋初值 其语法格式 其中 是赋值运算符 表示将初始数据存入变量名所代表的内存单元 如果相同类型的几个变量需要同时初始化 可以在一个声明语句中进行 其语法格式为 为了防止误用所声明的变量 最好对变量进行初始化 也就是说 在声明变量时给变量赋值 多个被定义的变量要用逗号分隔 2 3 5常数型变量 常数型变量 即const型变量 在程序中 const型变量只能在说明变量时指定其值 一旦初始化后就不允许修改其值 如果在程序中想对Const型变量进行修改的话 编译系统就会报错 第3章 运算符和表达式 本章主要内容 3 1基本运算符3 2表达式3 3运算符优先级和结合性3 4类型转换 3 1基本运算符 3 1 1算术运算符3 1 2关系运算符3 1 3逻辑运算符3 1 4位运算符3 1 5赋值运算符3 1 6逗号运算符3 1 7三目运算符3 1 8自增 自减运算符3 1 9sizeof运算符 3 1 1算术运算符 C 语言提供了7个算术运算符 正 负 其中包括单目运算符和双目运算符 C 中含有以下单目算术运算符 负数运算符 正数运算符 取正 与 取负 运算符用于对操作数取正和取负操作 取正的操作结果与操作数相同 取负操作的是将操作数变成原值的相反数 C 中含有以下双目算术运算符 加法运算符 减法运算符 乘法运算符 除法运算符 求模运算符 也称为求余运算符 3 1 2关系运算符 关系运算符完成两个操作数的比较运算 C 中提供了6个关系运算符 大于 大于等于 等于 不等于 它们都是双目运算符 运算的结果为一整数 当关系成立时 其运算结果为整数1 逻辑真 当关系不成立时 其运算结果为整数0 逻辑假 关系运算的结果可作为一个整数参与表达式的运算 关系运算符的两个操作数可以是任意的基本类型的数据 由于实数在计算机内进行运算和存储时 都会产生误差 在进行两个实数的比较时 不能采用精确的比较 直接比较两数的大小 3 1 3逻辑运算符 逻辑运算符把各个运算的变量 或常量 连接起来组成一个逻辑表达式 包括了逻辑非 逻辑与 逻辑或 三种逻辑运算符 其中 逻辑非是单目运算符 其只要求有一个运算量 逻辑与和逻辑或都是双目运算符 要求有两个运算量 当操作数 变量 为真时 逻辑非运算的结果则为假 对于逻辑与运算符 只有当两个操作数都为真时 逻辑与运算的结果则为真 对于逻辑或操作符只要有一个操作数为真 则逻辑或运算的结果就为真 逻辑运算符的运算优先级为 高于 高于 的优先级高于算术运算符 和 的优先级比关系运算符低 3 1 4位运算符 C 中提供了按位与 按位或 按位异或 移位运算符 和取反运算符 其中 统称为按位逻辑运算符 1 按位逻辑运算符1 取反运算符 是一元运算符 它是对其操作数进行二进制逐位取反运算 若二进制位为0 则取反后为1 若二进制位为1 则取反后为0 2 按位逻辑与 是二元运算符 参加运算的两个操作数按二进制位进行 与 运算 若两个数相应的二进制位都为1 则该位的结果值为1 否则为0 3 按位逻辑或 也是二元运算符 参加运算的两个操作数按二进制位进行 或 运算 若两个数相应的二进制位有一个为1 则该位的结果值为1 否则为0 4 按位异或 也称XOR运算符 其运算规则是 将两个操作数逐位进行运算 若对应位不同 则该位结果为1 否则为0 2 移位运算符移位运算符是二元运算符 其包括左移运算符和右移运算符两种 1 左移运算符的使用格式是operation m 其中m为整数 其作用相当于将operation的各个二进制位右移m位 当左移时 对于带符号数 最高位表示符号 可能会因为低位的1或0移到最高位 最终改变操作数的符号 当进行右移操作时 操作数右移m个二进制位后 左边移出的空位用符号位补齐 最高位始终补和原来的最高位相同的数 位运算符的运算优先级为 括弧中运算符的优先级相同 高于 高于 高于 高于 3 1 5赋值运算符 C 语言提供了两类赋值运算符 即基本赋值运算符和复合赋值运算符 基本赋值运算符为 复合赋值运算符有 赋值运算符作用是将一个数值或将一个表达式的值赋给一个变量 1 赋值运算符都是二元运算符 与其他二元运算符不同 赋值操作具有右结合性 即当表达式中有多个赋值运算符时 其是从右向左结合的 2 赋值运算符左边的操作数必须是非const的左值 3 在实际编写程序过程中 我们经常会用到一些复合赋值运算符 如 分别表示将操作数加上 乘以某一数值再将结果赋给操作数本身 4 多次连续赋值操作 赋值表达式的返回值是赋值后左边变量的值 可以将一个赋值表达式作为另一个赋值表达式的右操作数 实现连续的赋值 5 赋值运算符的优先级是同级的 3 1 6逗号运算符 在C 中 逗号 既是运算符 又是分隔符 逗号运算符用来将两个表达式连接起来 逗号表达式的一般表达形式为 逗号运算符是双目运算符 取其右操作数的值作为运算结果 逗号运算符的优先级最低 3 1 7三目运算符 在C 中 条件运算符由 和 两个符号组成 要求有3个操作对象 所以也叫它三目运算符 它是C 中唯一的三目运算符 它的一般形式为 以下是关于条件运算符的几点说明 1 通常情况下 表达式1是关系表达式或逻辑表达式 用于描述条件表达式中的条件 表达式2和表达式3可以是常量 变量或表达式 2 条件表达式的执行顺序为 先求解表达式1 若值为非0 表示条件为真 则求解表达式2 此时表达式2的值就作为整个条件表达式的值 若表达式1的值为0 表示条件为假 则求解表达式3 表达式3的值就是整个条件表达式的值 3 条件表达式的优先级别仅高于赋值运算符 而低于前面遇到过的所有运算符 4 条件运算符的结合方向为 自右至左 5 表达式1 表达式2 表达式3的类型可以不同 此时条件表达式值的类型为它们中较高的类型 3 1 8自增 自减运算符 在C 中 提供了两个具有给变量赋值运算作用的算术运算符 即自增运算符 自减 这两种运算符都是一元运算符 自增 自减运算符有前置和后置两种形式 1 前置运算 先自加 减 后引用 例如 i或 i 表示在使用i之前先使i加1或减1 2 后置运算 先引用后自加 减 例如 i 或i 表示使用i之后再使i加1或减1自增运算符和自减运算符只能用于变量 不能用于表达式或者常量 自增 自减运算符的优先级是同级的 结合方向都是自右向左的 自增自减运算符常用于循环语句中 使得循环变量自动加1或减1 也用于指针变量 使得指针指向下一个或上一个地址 3 1 9sizeof运算符 C 中 每种类型的变量都占用一定大小的存储单元 该存储单元的大小和变量的类型以及程序运行所在的机器有关 在程序中 若要获取变量占用的存储单元大小 应该使用sizeof运算符来获取 sizeof运算符用于测试某种数据类型或表达式的类型在内存中所占的字节数 它是一个一元运算符 其语法格式为 sizeof 或sizeof 3 2表达式 表达式一般是由运算符 圆括号和操作数构成 经过运算应有一个某种类型的确定的值 操作数可以是常量 变量或函数等 使用不同的运算符可以构成不同类型的表达式 如算术表达式 赋值表达式 关系表达式 逻辑表达式等 表达式的书写 操作数 运算符 圆括号之间可以加空格 也可以不加空格 1 左值表达式和右值表达式在C 中 左值就是在赋值中放在赋值运算符左边的值 可以是一个引用到对象的表达式 通过左值我们可以取出该对象的值 右值就是在赋值中放在赋值运算符右边的值 与左值不同的是右值只能出现在赋值的右边 不能出现在赋值语句的左边 2 算术表达式由算术运算符 位运算符和操作数组成的符合语法规则的序列称为算术表达式 算术表达式的值为整型或实型 3 赋值表达式赋值运算符就是 它的作用是将一个数据赋给一个变量 当然也可以将一个表达式赋给一个变量 赋值表达式要求赋值运算符左边必须是左值 其功能是用右值表达式的值修改左值 赋值表达式一般形式为 赋值表达式的一般求解过程是 先求赋值运算符右侧的 表达式 的值 然后赋值给赋值运算符左侧的变量 C 语言中 使用复合赋值表达式后 使语句表达简练 对赋值表达式说明以下几点 1 赋值表达式的值是其左操作数的值 其结果的类型为左操作数的类型 2 赋值操作具有低优先级 在赋值操作上加圆括号是必需的 因为赋值运算符的优先级是低于除逗号运算符以外的任何操作符 3 赋值操作具有右结合性 当表达式含有多个赋值运算符时 从右向左结合 4 赋值表达式的值类型为左值类型 4 关系表达式关系表达式是用关系运算符连接两个数值表达式形成的式子 关系表达式的一般形式为 关系表达式的求值结果只有两个逻辑值 0或1 0表示逻辑假 不成立 1表示逻辑真 成立 关系运算符 用来判定两个操作数是否相等 若两个操作数相同 则结果为真 否则为假 5 逻辑表达式逻辑表达式类似于关系表达式 是用逻辑运算符把两个表达式连接起来的式子 其一般形式为 逻辑操作的操作数类型与关系运算相同 其运算结果用整数表示 当逻辑关系成立时 其运算结果为真 反之 为假 6 逗号表达式逗号表达式是由逗号运算符和操作数组成的符合语法规则的序列 其一般的形式为 逗号表达式按从左到右的顺序依次求出各表达式的值 并把最后一个表达式的值作为整个逗号表达式的值 7 表达式语句在C 语言中 任何一个表达式后加上分号 就构成了表达式语句 其一般格式为 8 空语句空语句是什么也不执行的语句 空语句仅由一个分号组成 在程序中空语句可用来作空循环体 3 3运算符优先级和结合性 所谓优先级是指在同一个表达式中 多个运算符相邻出现时 总是先处理优先级高的运算符 而不管它们位置上的前后关系 运算符的结合性是指相邻的几个优先级相同的运算符的运算顺序 结合性也称为结合方向 有从左到右和从右到左两种 左结合性 运算对象先与左面的运算符结合 也就是从左到右运算 右结合性 运算对象先与右面的运算符结合 也就是从右到左运算 在对表达式求值时 如果在一个运算对象两侧的运算符优先级相同 则按规定的运算符结合性处理 3 4类型转换 3 4 1自动类型转换3 4 2强制类型转换3 4 3赋值转换3 4 4逻辑表达式求值的优化 3 4 1自动类型转换 在C 中 如果编译器看见一个表达式或者函数使用了不合适的类型 通常会进行自动的类型转换 即自动类型转换 这是指系统自动将表达式中的操作数转换成所需类型的值 一个表达式中不同数据类型的数据进行混合运算时 C 语言将两个不同类型的操作数自动转换成同一类型的操作数 然后再进行运算 这就是所谓自动类型转换 各种基本数据类型之间的自动类型转换规则如图3 1所示 图3 1不同数据类型的自动转换规则 转换规则是将低精度类型的数据转换为高精度类型的数据 因此在数据转换过程中 数据的精度不会损失 在处理表达式的过程中 并不是将低优先级的变量直接转换成高优先级的变量 而是在表达式处理的过程中 按照需要进行变换 即只有在需要时才进行转换 3 4 2强制类型转换 强制类型转换 也称显示类型转换 是由程序员在程序中用类型转换运算符明确指明的转换操作 自动类型转换是系统自动进行的 其转换的步骤是按照确定的方向进行的 也可以在变量或常量的前面加标识符来实现强制类型转换 强制类型转换的一般形式为 或者 3 4 3赋值转换 赋值表达式中 当赋值运算符左值表达式的类型与右值表达式的类型不同 且数据类型兼容时 将进行类型转换 C 语言先计算出右值表达式的值 然后将其转换为左值的类型后赋给左值 转换的准则为 1 将精度低的变量赋值给精度高的变量时 数值保持不变 2 将精度高的变量赋值给精度低的变量时 可能出现部分数值丢失 3 4 4逻辑表达式求值的优化 逻辑表达式求值的优化 在逻辑表达式求值时 一旦能确定其值 则不必再逐步求值 第4章 C 的基本语句 本章主要内容 4 1C 语言的语句和程序结构4 2选择结构语句4 3循环结构语句4 4控制执行顺序的语句4 5编程规范和编程风格 4 1C 语言的语句和程序结构 4 1 1C 语句分类4 1 2程序的基本结构 4 1 1C 语句分类 1 变量和对象声明语句在C 中 把完成对数据结构的定义和描述 对变量的定义性说明统称为声明语句 声明语句在程序的执行过程中 并没有完成对数据进行操作的执行体 而仅是向编译程序提供一些说明性的信息 它可放在函数中允许出现语句的任何位置 也可以放在函数定义之外 2 流程控制语句控制语句是用来完成对程序的执行顺序进行一定控制的语句 如程序的选择控制 循环控制 程序的跳转等 3 表达式语句表达式语句就是指在任一表达式的后面加上一个分号而构成的语句 4 函数调用语句函数调用语句是在一次函数的调用后加上一个分号所构成的语句 它完成一次函数的调用 5 空语句只由一个分号所构成的语句称为空语句 它不执行任何动作 主要用于指明被转向的控制点或在特殊情况下作为循环语句的循环体 6 复合语句复合语句 也称块语句 是指用花括号 把一个或多个语句括起来后构成一个语句 在C 中 复合语句从逻辑上被作为一个语句来处理 它可以出现在只允许出现一个语句的任何位置 花括号是C 中的一个标点符号 左花括号标明复合语句的开始位置 右花括号标明复合语句的结束位置 复合语句不需要分号来结束 复合语句主要是用在控制语句中 4 1 2程序的基本结构 在C 语言中 有结构化程序设计的3种基本结构 顺序结构 选择结构和循环结构 如图4 1所示 这3种基本结构都有以下两个共同特点 1 只有一个入口点 一个出口点 2 对于要执行的操作都有一条路径 即从入口到出口要执行的每一个操作 图4 13种基本控制结构 1 顺序结构顺序结构的程序是按从上到下的顺序依次执行各个语句 实现顺序结构的语句有说明语句和表达式语句等 2 选择结构选择结构是根据不同的条件执行结果做出不同的选择 从而执行不同的语句 实现选择结构的语句有if语句 if else语句和switch语句等 3 循环结构循环结构就是对程序中某些语句重复执行多次 实现循环结构的语句有for语句 while语句和do while语句等 4 2选择结构语句 4 2 1条件语句4 2 2条件运算符 4 2 3开关语句 4 2 1条件语句 条件语句又称为if语句 其根据条件是否满足来决定是否执行某条语句或者从两个语句中选择一个语句执行 它有3种基本格式 1 if语句If语句的语法格式为 if if语句的执行过程如图4 2所示 图4 2if语句的执行过程 2 if else语句if else的语句格式为 if 表达式 语句序列1 else语句序列2 if else语句执行过程如图4 3所示 图4 3if else语句的执行过程 3 if语句的嵌套if语句的嵌套是指在if语句的内嵌语句仍是if语句 例如 下面两个使用了if语句的嵌套形式的结构 语句格式为 if 表达式e1 语句S1elseif 表达式e2 语句S2elseif 表达式e3 语句S3 else语句Sn 4 2 2条件运算符 使用条件运算符 可以实现ifelse的功能 其一般形式为 exp1 exp2 exp3条件运算符有三个操作数 故我们将其称为三目运算符 条件运算符是C 语言中唯一一个三目运算符 我们把上面这个表达式称为条件表达式 这个条件表达式的意思是 如果exp1为真 则运算exp2 整个条件表达式的值为exp2的值 反之 则运算exp3 整个条件表达式的值为exp3的值 4 2 3开关语句 开关语句是指switch语句 它也称为多选择语句或者多分支语句 它可以根据给定的条件 从多个分支语句序列中选择执行一个分支的语句序列 该语句的一般格式为 switch 表达式 case 常量表达式1 语句序列1 break case 常量表达式2 语句序列2 break case 常量表达式n 语句序列n default 语句序列n 1 表达式 可以控制程序的执行过程 表达式的结果必须是整数 字符或枚举量值 2 case后面的常量标号 其类型应与表达式的数据类型相同 3 语句序列是switch语句的执行部分 4 break是中断跳转语句 表示在完成相应的case标号规定的操作之后 不继续执行switch语句的剩余部分而直接跳出switch语句之外 继而执行switch结构后面的第一条语句 如果不在switch结构的case中使用break语句 执行过程如图4 4所示 图4 4switch语句的执行过程 4 3循环结构语句 4 3 1while 语句4 3 2do while 语句4 3 3for 语句4 3 43种循环语句的比较4 3 5循环的嵌套及其应用 4 3 1while 语句 while 语句用于首先判断循环条件 当条件为 真 时 程序重复执行某些操作 其语句格式 while 条件表达式 循环体语句 while 语句的执行过程如图4 5所示 图4 5while语句的执行过程 4 3 2do while 语句 do while语句的一般语法格式为 dowhile 执行过程 先执行语句 后判断表达式的值 若表达式的值不为0 则继续执行循环体 直到表达式的值为0时为止 流程图为如图4 6所示 图4 6do while语句的执行过程 4 3 3for 语句 语句格式 for 表达式1 表达式2 表达式3 语句序列 其中的组成部分说明如下 表达式1 通常为赋值表达式 用来确定循环结构中的控制循环次数的变量的初始值 实现循环控制变量的初始化 表达式2 通常为关系表达式或逻辑表达式 用来判断循环是否继续进行的条件 将循环控制变量与某一值进行比较 以决定是否退出循环 表达式3 通常为表达式语句 用来描述循环控制变量的变化 多数情况下为自增 自减表达式 复合加 减语句 实现对循环控制变量的修改 循环体 语句序列 当循环条件满足时应该执行的语句序列 可以是简单语句 复合语句 若只有一条语句 则可以省略 for语句的执行过程可以用如图4 7所示的流程图来描述 图4 7for语句的执行过程 4 3 43种循环语句的比较 1 for和while语句都是先判断循环条件 循环体可能一次也不执行 而do while语句是先执行循环体 后判断循环条件 所以循环体至少要执行一次 2 由于for语句有三个表达式 可分别用于循环变量初始化 循环结束条件和循环控制变量的更新 所以用得最多的是for语句 其次是while语句 而do while语句相对于前两种语句用得少一些 在实际应用中 通常根据具体情况来选用不同的循环语句 选用的一般原则是 1 如果循环次数在执行循环体之前就已确定 一般用for语句 如果循环次数是由循环体的执行情况来确定 则采用while语句或do while语句 2 当循环体至少要执行一次时 采用do while语句 反之如果循环体可能一次也不执行 则选用while或for语句 4 3 5循环的嵌套及其应用 一个循环语句的循环体内包含另一个完整的循环结构 称为循环的嵌套 这种嵌套的过程可以有很多重 一个循环的外面包围一层循环叫双重循环 如果一个循环的外面包围二层循环叫三重循环 一个循环的外面包围三层或三层以上的循环叫多重循环 这种嵌套在理论上来说可以是无限的 正常情况下 应先执行内层的循环体操作 然后是外层循环 例如 对于双重循环 内层循环被执行的次数应为 内层次数 外层次数 三种循环语句while do while for可以互相嵌套 自由组合 外层循环体中可以包含一个或多个内层循环结构 但要注意的是 各循环必须完整包含 相互之间绝对不允许有交叉现象 因此每一层循环体都应该用 括起来 4 4控制执行顺序的语句 4 4 1break语句4 4 2continue语句4 4 3goto语句4 4 4exit和abort函数 4 4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025浙江杭州萧山技师学院第二次职业教育合同制教师招聘28人笔试考试备考试题及答案解析
- 2025青海海西州德令哈市招聘社区工作人员113人笔试考试参考试题及答案解析
- 2025年浙江丽水市中医院引进高层次人才9人(第四批)考试笔试模拟试题及答案解析
- 2025黑龙江大庆松嫩农牧渔业集团有限公司会计岗位招聘2人笔试考试备考试题及答案解析
- 中班健康安全活动课件
- 安全教育课件获奖
- 垃圾分类代理协议书
- 咨询项目外包协议书
- 员工消防协议书范本
- 卖车合同解除协议书
- 教材教法标准试题及答案
- 2025及未来5-10年制版印刷一体化机项目投资价值市场数据分析报告
- 2025年大学《经济学-政治经济学》考试备考试题及答案解析
- 妇产科妊娠合并子宫肌瘤护理教程
- 2025甘肃白银靖远县北滩镇选聘专业化管理村文书2人考试笔试备考试题及答案解析
- 2025年枣庄市工会社会工作者公开招聘(34人)笔试考试备考试题及答案解析
- 2025年公司财务总监年终总结(五篇)
- 水厂建设项目施工方案
- 非洲猪瘟安全培训课件
- 2025陕西延长石油榆林煤化有限公司招聘120人笔试历年难易错考点试卷带答案解析试卷2套
- 2026中国人民大学管理职员和教师以外专业技术人员招聘考试笔试参考题库附答案解析
评论
0/150
提交评论