第6章 C语言选择结构_第1页
第6章 C语言选择结构_第2页
第6章 C语言选择结构_第3页
第6章 C语言选择结构_第4页
第6章 C语言选择结构_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章选择结构前几章介绍了C语言的几个基本要素(变量、常量、数据类型、语句、操作符和表达式),本章和第7章将介绍C语言中的基本程序结构。在第1章关于程序基础知识的介绍中,已经讨论了三种基本结构。在前几章的范例中接触到的程序基本都属于顺序结构,本章将先讨论选择结构的使用。C语言提供了多种手段来实现选择结构:if语句、switch语句、条件表达式和逻辑表达式。它们各有优劣和适用的场景。通过本章的学习,需要掌握以下内容:第6章选择结构if语句三种形式的使用;使用switch语句实现多路选择结构;elseif结构和switch语句的使用范围;条件表达式的使用,以及与if语句的比较;逻辑表达式的隐式选择。6.1if语句if语句是C语言中实现选择结构最常用的方式。当if语句和else语句组合时候时,可以实现更灵活更复杂的选择结构。学会熟练地使用if语句是C编程的基础。本小节将讨论如何使用if语句来实现选择结构,已经使用中需要注意的问题。6.1.1使用if语句if语句的功能是根据一个条件判断的结果选择执行某一分支。if语句可以分为两个部分:if头和if体。if头由关键字if和包含在括号中的表达式组成。if体由一个语句或一个复合语句组成。例如:if(判断表达式){ /*if头*/操作1; /*if体*/操作2;…}6.1.1使用if语句if语句经常和else语句组合使用。else语句也由两部分:else头和else体。关键字if和关键字else搭配使用的标准形式如下:if(判断表达式){操作1;}else{ /*else头*/操作2; /*else体*/}合理地组合if语句和else语句,可以实现以下三种选择结构。6.1.1使用if语句1.if结构if(表达式){操作1;}该结构的程序流程图如右图所示。6.1.1使用if语句2.if-else结构if(表达式){操作1;}else{操作2;}if-else结构的程序执行流程图如右图所示。6.1.1使用if语句3.elseif结构if(表达式1){执行操作1;}elseif(表达式2){执行操作2;}elseif(表达式3){执行操作3;… /*在这里允许有任意多个elseif语句*/}else{执行操作4;}该结构实现了多路分支结构,其中可以有任意多个elseif语句,每一个elseif都是一路程序分支。其程序流程图如下图所示。6.1.1使用if语句elseif结构实际上是if-else结构的变种,可以其改写为if-else结构(为了简化,程序只包含一个elseif):if(表达式1){执行操作1;}else{/*以下全部内容为第一个else的else体*/if(表达式2){执行操作2;}else{if(表达式3){执行操作3;}else{执行操作4;}}}6.1.2else和if的配对使用关键字else与if的组合使用可以实现多种丰富的选择结构。但在当程序中使用else语句时,务必保证关键字else必须存在一个正确配对的if。当if体或else体中嵌套使用if语句的三种形式时,else和if的配对情况会变得复杂,若不细心处理,就有可能发生错误。6.1.3选择结构中的不平等分支在一个选择结构中,如果有多个分支,而各分支的关系是不平等的,则按照思维逻辑的习惯可以将分支按重要性或优先级的顺序从高到低排放。而在if-else结构中,如果两个分支不是平等的,请按照逻辑思维习惯,把重要的或者正常的分支处理放在if体里,即当if头的选择表达式为真时进入的分支是重要的或者正常的;而次要的或者异常的分支处理放在else体。如果是多路分支选择结构,一般按分支的重要性依次向后排列。6.1.4判断表达式中的=与==赋值操作符=与等于操作符==只相差一个等号,前者多写一个等号就变成后者,而后者少写一个等号也变成前者。这种错误在编程中十分常见。而且,这两种都是合法的写法,编译器无法自动检测。如果这种错误出现在if语句的判断表达式中,很可能出现期望外的逻辑完全不一样的程序。因此,编程时必须特别小心。下面的范例讨论了这种错误的危险,并讨论一种防范这种错误的措施。6.2switch语句switch语句是C语言中选择结构的另一个常用的实现方式,十分适用于多路选择的实现。本小节将讨论switch结构的使用和break语句在switch结构中的作用,同时还比较了switch结构和if-else结构在实现多路选择中的优劣,最后还介绍了标号的使用。6.2.1使用switch语句switch语句的标准形式如下:switch(判断表达式){ /*switch头,下面为switch体*/case常量表达式1:操作1; /*分支1*/case常量表达式2:操作2; /*分支2*/case常量表达式3:操作3; /*分支3*/…default:操作n; /*异常情况*/}6.2.2break语句break语句在switch语句中的作用十分重要。在switch语句中,遇到break便终止执行switch语句,跳出本层switch体,继续执行后续语句。正确使用break语句与case语句和合理搭配,可以实现功能强大的多路选择功能。6.2.3elseif语句和switch语句比较例6-1和例6-4,读者会发现elseif语句和switch语句都适合用在多路选择的场景中。那么,他们的区别是什么呢?整数或值为整数的表达式都可以构造成具有有效布尔值的表达式,所以所有的switch语句都可以转化为elseif语句。然而,大多数的情况下,这种转化只会降低效率,是不能带来任何好处的。所以,使用switch语句实现多路选择结构比使用if-else语句更有优势。如果能使用switch语句,应该首先选择switch语句。6.2.4switch中的标号在switch语句中,涉及到了两种标号:case标号和default标号。标号本身的存在不会改变程序的流程,但与跳转主体(switch与goto,后面章节会介绍goto语句)搭配时,标号的存在会产生不同的执行过程。6.2.5使用具名常量组成标号具名常量,顾名思义就是有名字的常量,它是C语言中宏定义的一种用途,属于预处理命令,是在程序编译前(预处理)进行的工作。在“预处理”一章中会详细讨论预处理的用法和功能。具名常量的定义由三部分组成:#define、具名常量和数值。其标准形式如下:#define具名常量数值常量6.3条件操作符与条件表达式条件操作符是C语言中唯一的三元操作符,由条件操作符组成的条件表达式可以实现简单的选择结构。由于整个选择结构都实现在一条语句中,限制了条件表达式的功能,但也因此使其更适用于实现比较简单的选择控制结构。本小节将先介绍条件操作符和条件表达式的使用,再比较了条件表达式与if-else结构的优劣,最后讨论了条件表达式的类型转换和嵌套使用。6.3.1使用条件操作符条件表达式是通过使用条件操作符来实现的。条件操作符是个三元操作符,其标准形式如下:表达式1?表达式2:表达式3;流程图如右图所示。6.3.2条件表达式与if-else不同点主要包括以下两点:条件表达式的表达式2和表达式3都只能是一句语句,不能为复合表达式;而if体和else体则可以为复合表达式。条件表达式仍可以作为其他表达式的子表达式。6.3.3条件表达式中的类型转换在条件表达式中,第2个表达式的值类型必须与第3个表达式的值类型相同。后两个表达式的值该类型就是条件表达式的值类型。如果两个值类型不同,则需要进行类型转换,其遵循的规则与数值运算中的类型转换相同。6.3.4条件表达式的嵌套条件表达式可以嵌套使用,即把一个条件表达式作为另一个条件表达式中的子表达式。例如,可以将范例6-7的if-else结构用条件表达式改写如下:((0==i?b:a)>0)?printf("b>0\n"):printf("b<=0\n");6.4逻辑表达式的隐式选择在第4章中已经分别讨论过逻辑与表达式和逻辑或表达式,利用逻辑与和逻辑或运算的一些特点,可以实现功能简单的选择结构。本小节将讨论这两种逻辑表达式中隐含的选择结构以及如何有效使用的方法。6.4.1逻辑表达式的特点先来回顾一下逻辑操作符&&与¦¦的一些特性:0&&0=00&&1=01¦¦0=11¦¦1=1从以上特性可以得到以下结果:0&&任意表达式=01¦¦任意表达式=16.4.1逻辑表达式的特点因此,对于逻辑与表达式:表达式1&&表达式2按从左到右的顺序,先计算表达式1的值。如果该值为0(也可以说成布尔值为假),就已经可以确定整个逻辑与表达式的值,表达式2的值将无法影响整体,将不被运行。只有当表达式1的值为1(非0即1)时,才会继续计算表达式2。6.4.1逻辑表达式的特点流程图如下图所示。6.4.1逻辑表达式的特点而对于逻辑或表达式:表达式1||表达式2按从左到右的顺序,先计算表达式1的值。如果该值为1(非0即1,也可以说成布尔值为真),同样也已经可以确定整个逻辑或表达式的值,表达式2的值也已经无法影响整体,将不被运行。只有当表达式1的值为0时,才会继续计算表达式2。6.4.1逻辑表达式的特点流程图如下图所示。6.4.2隐式选择的作用由上一小节的讨论可以知道,逻辑与表达式和逻辑或表达式中的第2个表达式都是不保证被执行的。如果不注意这一点,把一些程序中必需执行的功能操作放在第2个表达式中,程序执行过程中将可能会跳过该操作。如果跳过,将会导致一些难以察觉的错误。6.4.2隐式选择的作用将条件表达式的隐含的选择结构进行分解,得到程序流程图如下图所示。6.4.3巧用隐式选择然而,逻辑与表达式和逻辑或表达式隐含的选择结构也不是一无是处,它们在一些特定的场合下可以发挥有益的作用。由于两个表达式的隐式选择发挥作用时的值不一样,使用场景也有些不同。当表达式2只有在表达式1布尔值为真的情况下,可以使用逻辑与表达式,尤其适用于有些表达式必须在满足某个表达式布尔值为真时才合法的场景。逻辑或表达式多用于如果表达式1为真就不必不关心表达式2的值的场景。下面将举几个实例来演示隐式选择的使用方法。6.4.3巧用隐式选择1.变量用作除数当变量作为除数时,是不能为0的,因此要先检查它是否为0。使用逻辑表达式可以实现如下:/*判断b是否不小于a的平方*/if(a!=0&&b/a>=a){ /*a,b均为整型*/dosomething;}在这个例子里,只有当a不等于0时,才能作为除数,b/a>=a才合法,这种情况下才执行第二个表达式;如果a等于0,则条件表达式结束,值为0。上面的例子不能写为:if(b/a>=a){dosomething;}这时,若a等于零,将出现错误。也不能写为:if(b/a>=a&&a!=0){dosomething;}这也会产生错误,因为不管a是否为0,都会执行b/a。6.4.3巧用隐式选择2.使用结构体指针当变量为结构体指针时,若要访问其成员,必须要保证该变量指向一个实体(即不为NULL)。使用逻辑表达式可以实现如下:if(ptr&&ptr->data==data){ /*ptr指向一个含有成员data的结构体*/dosomething;}只有当ptr不等于0(或NULL),ptr->data才合法。如果ptr不等于0,执行第二个表达式;如果ptr等于0,则条件表达式结束,值为0。结构体指针会在第18章中详细讨论。6.4.3巧用隐式选择3.逻辑或表达式的多条件判断下面这段代码是范例6-5中的一段elseif语句:……elseif(4==month /*4月份*/||6==month /*6月份*/||9==month /*9月份*/||11==month) /*11月份*/printf("thereare30daysinthismonth!\n");……6.4.3巧用隐式选择实现功能为:如果变量month等于4,6,9或11时,程序打印结果。这个结构的if头中含有4个判断,但是当month等于4时,只执行了一次判断;当month等于6时,只执行了两次判断;当month等于9时,执行三次判断;其余情况下才会执行四次判断。该代码可以用elseif语句展开得到完全等效的语句,如下:elseif(4==month) /*4月份*/printf("thereare30daysinthismonth!\n");elseif(6==month)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论