




已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章选择结构程序设计 4 1关系运算符和关系表达式 4 1 1关系运算符关系运算符用于判断两个数据之间的某个关系是否成立 C语言提供了六种关系运算符 大于 大于等于 等于 不等于 关系运算的结果是逻辑值 成立 真 或不成立 假 5 3运算结果为真3 5运算结果为假 使用关系运算符需要注意 1 注意书写格式 是表示判断两个数据数值是否相等 一定要和赋值运算符 区分开 2 注意运算符优先级和结合性 的优先级相同 6级 和 的优先级相同 7级 关系运算符的结合方向均为自左向右结合 a b c a b c a b c a b c a b c a b c 3 关系运算符均是二元运算符 一个关系运算符的两个操作数类型要相同 如果类型不一致 系统将自动进行类型转换 A 65运算结果为真 0 0运算结果为假 4 1 2关系表达式 关系表达式是指利用关系运算符将两个表达式连接起来形成的式子 关系运算的结果为逻辑值 由于C语言中没有逻辑类型 因此当运算结果为真时 用整数1表示 当运算结果为假时 用整数0表示 关系表达式的值也是一个逻辑值 即1或0 假设变量已如下定义 inta 3 b 2 c 1 d 5 f a b表达式值为1a b c等价于 a b c 表达式的值为1b cb等价于d a b d的值为1f a b c d等价于f a b c d f的值为0 4 2逻辑运算符和逻辑表达式 4 2 1逻辑运算符逻辑与运算 与运算的表示符号为 表示的含义是 并且 它可以表达两个条件必须同时满足的语义 与运算符的语法格式为 表达式1 表达式2如果表达式1和表达式2都为真 与运算结果即为真 否则 运算结果为假 逻辑或运算 或运算的表示符号为 表示的含义是 或者 它可以表达两个条件只要有一个满足即可得语义 或运算的语法格式为 表达式1 表达式2如果表达式1和表达式2都为假 或运算结果为假 否则 运算结果为真 逻辑非运算 非运算的表示符号为 表示的含义是 否定 它可以表达条件不满足的语义 非运算的语法格式为 表达式1如果表达式1为真 非运算结果为假 如果表达式1为假 非运算结果为真 三个逻辑运算符的优先级从高到低依次为 非运算 2级 与运算 11级 或运算 12级 非运算是自右向左结合的 与运算和或运算是自左向右结合的 4 2 2逻辑表达式 逻辑表达式是指利用逻辑运算符将逻辑量或关系表达式连接起来形成的式子 逻辑表达式的值是一个逻辑值 即 真 或 假 在C语言中分别用整数1或0表示 在C语言中 任何表达式 包括变量 常量以及由运算符连接的表达式 都可以参与逻辑运算 也就是说任何一个表达式都可以作为一个逻辑值来使用 规则是 如果该表达式的值等于0 则作为逻辑假值参与逻辑运算 如果该表达式的值等于非0值 则作为逻辑真值参与逻辑运算 假设变量已如下定义 inta 4 b 5 a表达式值为0a b表达式值为1a b表达式值为1 a b表达式值为14 0 2等价于 4 0 2 表达式值为1 c d 表达式值为1 x等价于x 0 当x值为0时 表达式 x值为1 表达式x 0值也为1 当x值不为0时 表达式 x和表达式x 0的值均为0 短路特性 运算符 和 有一个很重要的短路特性 即这两个运算符首先计算左操作数的值 然后才计算右操作数的值 如果表达式的值可以通过左操作数的值直接得到 则不再计算右操作数的值 a b首先计算a的值 如果a为假值 则可以直接得出表达式的值为0 此时不再计算b的值 如果a为真值 则计算b的值 从而得到表达式的值 a b首先计算a的值 如果a为真值 则可以直接得出表达式的值为1 此时不再计算b的值 如果a为假值 则计算b的值 从而得到表达式的值 考虑下面的表达式 思考一下表达式计算后 变量m n的值如何变化 inta 1 b 2 c 3 d 4 m 1 n 1 m a b n c d 4 3选择结构 4 3 1if语句语法格式 if 表达式 语句执行过程是 先计算表达式的值 如果表达式为真值 那么接着执行小括号后面的语句 否则 如果表达式为假值 不执行括号后面的语句 程序将继续执行if语句后面的其他语句 小括号中的表达式可以是关系表达式 逻辑表达式 算术表达式 常量等任意形式的表达式 只要表达式的值不为零 表达式即作为真值处理 if x printf xisnotequalto0 if x 0 printf xisnotequalto0 if x printf xisequalto0 if x 0 printf xisnotequalto0 if 1 printf thisexpressionisalwaystrue 例 已知符号函数的定义形式如下 编写程序 根据输入的x值 输出相应的y值 includevoidmain intx y printf Pleaseinputthevalueofx scanf d 需要注意 根据if语句的语法要求 在小括号后面是单独一条语句 而不是多条语句 如果当表达式为真值时 需要执行多条语句应该使用复合语句 复合语句的格式为 若干条语句 复合语句是通过一对大括号包围多条语句来实现 复合语句将被作为一条语句来处理 i sum i 注意 其中的每条语句均以分号结束 而复合语句本身没有分号 4 3 2else子句 if 表达式 语句1else语句2如果括号内的表达式为真 则执行括号后面的语句1 当表达式值为假 则执行else后面的语句2 语句1和语句2只能有一个能被执行 例 输入两个整数 将较大者输出 includevoidmain inta b max printf Pleaseinputthedataaandb scanf d d 4 3 3if语句嵌套 编写程序时我们会遇到根据多个不同的条件 分别去执行不同操作的情况 这时就需要使用嵌套的if语句来实现了 在if语句内部和else子句内部可以包含任何类型的语句 通过在if语句和else子句内部嵌套其它if语句可以形成if语句的嵌套形式 两级if语句嵌套的一般格式 执行过程如果表达式1成立 并且表达式2成立 则执行语句1 如果表达式1成立 并且表达式2不成立 则执行语句2 如果表达式1不成立 并且表达式3成立 则执行语句3 如果表达式1不成立 并且表达式3不成立 则执行语句4 if 表达式1 if 表达式2 语句1 else语句2 elseif 表达式3 语句3 else语句4 例 编写程序 要求从键盘输入一个字符 判断其类型 将字符分为四种类型 小写字母 大写字母 数字或者其他字符 includevoidmain charch printf Pleaseinputaletter scanf c 4 3 4使用if语句应注意的问题 1 在 表达式 后面或else关键字后面加分号通常会导致出现语义错误 单独使用一个分号表示一个空语句 voidmain intx x 1 if x 1 这里多加了个分号 printf x等于1 n elseprintf x不等于1 n 当尝试对该程序进行编译时 C语言编译器会报告 illegalelsewithoutmatchingif 的语法错误 voidmain intx x 1 if x 1 printf x等于1 n else 这里多加了个分号 printf x不等于1 n 该程序运行后的输出结果为 x等于1x不等于1 这并不是我们所期望得到的输出结果 2 如果if语句内部或else子句内部需要放置多条语句 必须将这多条语句构成一个复合语句 这样才能符合if语句的语法格式 例 输入三个整数 将其降序排序后输出 includevoidmain inta b c t printf inputthedata scanf d d d 3 在嵌套的if语句中 确保else子句和对应的if语句正确匹配是非常关键 else子句不能单独使用 每个else子句必须属于前面出现的某个if语句 考虑下面的程序片段 if a b if b c printf a b c elseprintf a b 上面的else子句应该属于哪一个if语句呢 C语言编译器遵循这样一个简单原则 else子句总是和离它最近的 还未和其它else匹配的if语句进行匹配 因此在上述程序片段中 else子句实际上是和第二个if语句匹配的 写成下面的形式可以更直观的表达出它们的匹配关系 if a b if b c printf a b c elseprintf a b 这样的话 上面的程序片段便出现了严重的逻辑矛盾 从语义上分析 我们希望else子句和第一个if语句匹配 为了实现这一点 我们可以用一对大括号将第二个if语句括起来 if a b if b c printf a b c elseprintf a b 4 3 5条件运算符和条件表达式 条件运算符可以根据条件在两个备选值中选择一个条件运算符由符号 和符号 组成条件运算符是一个三元运算符 要求有3个操作数条件表达式的一般形式为 表达式 表达式 表达式 条件表达式的求值过程 首先计算表达式1的值 如果表达式 的值不为零 即值为真 则计算表达式 的值 并将该值作为整个条件表达式的值 如果表达式 的值为零 即值为假 则计算表达式 的值 并将该值作为整个条件表达式的值 例如inta 1 b 2 min max min ab a b 上述语句执行后 变量min的值为1 max的值为2 使用条件表达式可以代替一些简单的if语句 if a b max a elsemax b max a b a b if a b printf d a elseprintf d b printf d a b a b 条件运算符的优先级高于赋值运算符和逗号运算符 低于所有其它运算符 其结合方向为自右向左 x 0 1 x 0 1 0 x 0 1 x 0 1 0 4 3 6switch语句 基本形式的if语句可以根据一个判断条件形成两个处理分支 为了描述更多的分支 我们可以使用嵌套形式的if语句 C语言还提供了另外一个可以描述多个处理分支的语句 switch语句 switch语句可以根据一个表达式的值决定选择哪一个分支 switch语句语法格式 switch 表达式 caseE1 语句序列1 caseE2 语句序列2 caseEn 语句序列n default 语句序列 switch关键字后面是用括号括起来的表达式 称为控制表达式 该表达式必须为整型或字符型 不能是实型或字符串 case关键字后面的表达式E1 E2 En必须是常量表达式 常量表达式中只能包含常量不能使用变量 这些常量表达式类型应为整型或字符型 且它们的值必须互不相同 caseE1 caseE2 caseEn default 被称为分支标号 分支标号以冒号结束 对分支标号的排列顺序是没有要求的 在每个分支标号后面可以包含一组语句 不需要使用大括号将每组语句括起来 每组语句中的最后一条语句通常是break语句 语法格式中用中括号括起来的部分是可选的 switch语句的执行过程 首先计算控制表达式的值然后将该值与常量表达式E1 E2 En的值依次进行比较 如果控制表达式的值等于E1的值 则执行语句序列1 如果控制表达式的值等于E2的值 则执行语句序列2 以此类推 如果控制表达式的值不等于E1至En中的任何一个值 则执行default 分支标号后的语句序列 如果省略了default 分支标号 则不执行任何语句 例 输入1至7中的一个数值 然后打印出该数值对应的日期 includevoidmain intday printf pleaseinputadigit scanf d 4 3 6break语句 在switch语句中 每个分支标号后的一组语句中的最后一条语句通常是break语句 可以看出 break语句的作用是使程序跳出switch语句 继续执行switch语句后面的其它语句 如果去掉了break语句 我们将得到不合理的执行结果 includevoidmain intday printf pleaseinputadigit scanf d 程序运行后 假设我们输入3 然后程序会输出 WednesdayThursdayFridaySaturdaySundaydataerror 产生这种的结果的原因在于switch语句是一种 基于比较的转移 当控制表达式的值与某个常量表达式的值相等时 程序便转移到相应的分支标号处 开始执行分支标号后的语句 这里 分支标号仅起到标识目标语句位置的作用 不能实现对多个处理分支的分割 当执行完一个处理分支内的语句后 如果没有break语句 程序将直接进入下一个处理分支 然后继续执行下一个分支内的语句 有时我们可以利用这个特点 使得多个处理分支可以共享一组语句 例 输入1至7中的一个数值 然后打印出该数值对应工作日或休息日 includevoidmain intday printf pleaseinputadigit scanf d 4 3 7应用实例 例 输入学生的百分制成绩 输出该学生的成绩等级 大于等于90分为 A 80分至89分为 B 70分至79分为 C 60分至69分为 D 60分以下为 E 第一种解决方法 我们用if语句实现 第二种解决方法 我们使用switch语句实现 includevoidmain intscore printf inputthescore scanf d includevoidmain intscore intd printf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑工程外墙油漆合同范本
- 商铺租赁合同法律风险注意事项
- 幼儿园租售合同范本及注意事项
- 建筑装修地板砖施工劳务合同范本
- 配音制作法律合同范本模板
- 示教室物品配备及管理规范
- 公司网络安全响应团队组织架构
- 小学科学课程教学重点难点总结
- 含氟呋咱衍生物靶向日本血吸虫TGR的设计策略及氮氧偶极对短肽构象限制机制研究
- 绿化迁移协议4篇
- 《成人重症监护病房口腔护理专家共识》解读课件
- 2025中小学生法制知识竞赛题库及答案
- 恶性间皮瘤护理查房
- 2025新版劳动合同范本
- 喷锚支护施工技术
- 自带设备管理办法
- 2025年天津港校招笔试题目及答案
- 初一初二心理健康讲座
- 2025年二建《建筑实务》真题答案及解析
- 光学相干断层扫描(OCT)在眼科诊断中的应用考核试卷
- 消防设备供货质量保证措施
评论
0/150
提交评论