资源描述
控制流,吴清锋2007年秋,提纲,选择结构if条件运算符switch循环结构whiledo-whileforbreak与continuegoto运算符小结,结束,小提醒,学习这部分内容时:首先,要掌握每一形式的规范。如在if()中,别忽视()的存在;其次,要区分各种形式之间的差异;再次,一定要记住“该用时就该用”(即:记住它们的功能)要思考,引进选择结构和循环结构的背景!什么是选择?什么是循环?,结束,if(1):if语句的三种形式,语句形式(注意联系图示):if(表达式)语句if(表达式)语句1else语句2if(表达式1)语句1elseif(表达式2)语句2elseif(表达式n-1)语句n-1else语句n示例,此处的语句指单个语句,如果在某个分支中需要执行多个操作,必须使用块语句(回忆下!)。包围表达式的小括号是必须的。此处的表达式不要求是逻辑表达式或关系表达式,可以是数值表达式(非0表示真,0表示假),这个else语句n也可以没有,此形式一般用来解决带“区间”的问题。注意,表达式的书写及涵盖关系!P96,if(2):if语句的嵌套,if语句中的内嵌语句也可能是if语句。一般形式是:if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4,if(3):if语句歧义,歧义情形:if(表达式1)if(表达式2)语句1else语句2解决方案:C规定,else总与较近的if配对。如果想表达左边这种情形必须采用如下形式:if(表达式1)if(表达式2)语句1else语句2,返回,条件运算符(1),当if语句中无论表达式为“真”和“假”时,都只执行一个赋值语句,并赋值语句的左值相同时,C允许使用形式更简单的条件运算符来替代。如:if(ab)max=a;elsemax=b;等价于max=(ab)?a:b;其中,(ab)?a:b为“条件表达式”。条件表达式的一般形式为:表达式1?表达式2:表达式3条件运算符:要求有3个操作对象,是C语言中唯一的三目运算符。条件运算符的执行顺序和条件表达式的值。,要求,能够互为转换!,条件运算符(2),条件运算符优先级高于赋值运算符,但是低于或运算符。所以max=(ab)?a:b等价于max=ab?a:bab?a:b+1等价于ab?a:(b+1)条件运算符的结合方向为“自右至左”。所以ab?a:cd?c:d等价于ab?a:(cd?c:d)注意,与(ab?a:c)d?c:d不同。条件表达式中,三个表达式的类型均可不同。当表达式2和表达式3的类型不同时,可能出现类型转换。如:xy?1:1.5,返回,double型,switch,switch()是多分支选择语句语句形式:switch(表达式)case常量表达式1:语句组1case常量表达式2:语句组2case常量表达式n:语句组ndefault:语句组n+1示例,返回,表达式可以任意类型,其值将自动转换为整数。各常量表达式的值必须是整数,且各不相同。当某case常量表达式被匹配成功时,将执行其后语句组,执行过程将一直持续到遇见break、return或switch语句的结束“”。,语句形式:while(表达式)语句注意:while的循环体只能包含一个语句,若有多项操作应采用复合语句。while的特点是先判断表达式,后执行循环体;故while语句的循环体可能一次也不被执行。使用while语句经常容易犯的错误是:在循环体中不包含能最终促使循环结束的语句死循环。这就意味着循环体的书写需要注意!引入“循环变量”的概念!示例(P114(6.2),while,返回,语句形式:do语句while(表达式);注意do-while语句的特点是先执行循环体,再判断循环条件是否成立。故循环体至少执行一次。特别注意,执行过程!P115示例,do-while(1),把do-while转换成while把while转换成do-while总结下,while和do-while之间的差异,do-while(2),返回,语句形式:一般形式:for(表达式1;表达式2;表达式3)语句for语句的执行过程最简单的应用形式:for(循环变量赋初值;循环条件;循环变量增值)语句如:for(i=0;i=n;i+)printf(%d,i);注意:for语句的三个表达式都不是必须的,但作为分隔符的分号却是必须的,下面是一些例子:i=0;for(;i=n;i+)printf(%d,i);for(i=0;i0)i+;printf(i=%dn,i);elsei-;if(x=y)|(x=z)printf(xisequaltoyorxisequaltozn);if(a=b)printf(a=%dn,a);,示例:if(2),输入两个数,并要求按由小到大的次序输出main()floata,b,t;scanf(%f%f,扩展下:如果是三个数,如何进行有序的输出呢?注意:上面的题目是,进行有序的输出;而P13(1.6)是只需要最大值的输出,请思考它们实现上的差异!,示例:if(3),输入三个数,并要求按由小到大的次序输出main()floata,b,c,t;scanf(%f%f%f,返回,示例:switch,下列程序片段是否正确?inti=10,j=10;switch(i)casej:printf(i=%d,incase%dn,i,j);case10:printf(i=%d,incase%dn,i,10);#defineJ10inti=10;switch(i)caseJ:printf(i=%d,incase%dn,i,J);case10:printf(i=%d,incase%dn,i,10);,返回,示例:while,输入一个整数,求其阶乘main()intn,p,i;scanf(%d,返回,如果输入小于等于1,循环体将不被执行。程序的不足之处,对于输入是否非负没有判别。,要思考,怎么就不用顺序结构或是选择结构呢?问题本身如何体现出“循环”?,示例:do-while,输入一个整数,求其阶乘main()intn,p,i;scanf(n=%d,返回,注意到,初试化部分不能直接设置i=2,这样将多执行一次乘法!,
展开阅读全文