该章内容:本章我们学习三大结构之一:选择结构,采用选择结构来解决问题称为判断问题,它的求解规则是在不同的条件下进行不同的操作。选择结构比顺序结构要复杂一些。本章是考试的重点章节。

学习方法:先了解选择结构相关的基础知识,然后做选择结构简单的习题,逐步加入复杂的语句。最终一定要学会如何写简单的选择结构的程序。

第一节 关系运算符、关系表达式

知识点:语句和表达式之间的联系;分号的使用;复合语句

重要程度:★★★★

1、C语言中的逻辑值

C语言中的逻辑值只有两个:“真”和“假”。用非零来代表“真”,用零来代表“假”。

C语言中只有一个数值表示假,就是0。其它的数据都是表示真,如:1.1,2.9,-2等等。

1、关系运算符和关系表达式

所谓的关系运算就是比较运算,将两个数进行比较,判断比较的结果是否符合条件。

1.1 C语言中的关系运算符

C语言提供了6种关系运算符,如表1所示。

表1  C语言中的6种关系运算符及其优先级

优先级

优先级相同(高)

优先级相同(低)

关系运算符

>

(大于)

>=

(大于等于)

<

(小于)

<=

(小于等于)

==

(等于)

!=

(不等于)

             

注意:

1)由两个字符组成的运算符之间不可以加空格,如<=就不能写成:< =。

2)前四种关系运算符(>、>=、<、<=)的优先级相同,后两种关系运算符(==、!=)的优先级相同,前四种关系运算符的优先级高于后两种关系运算符。

3)关系运算符的优先级低于算术运算符。如“+”的优先级高于“<”。

4)关系运算符的优先级高于赋值运算符。如“=”的优先级低于“==”。(注意“=” “==”的区别)。(考试的重点

5)关系运算符都是双目运算符,自左至右的结合性。如4<5<2则等价于(4<5)<2(考试重点)。

1.2 关系表达式

关系表达式:用关系运算符将表达式连接起来的式子称为关系表达式。

关系表达式的值:关系表达式的值若为真,则结果为1;若为假,则结果为0。(只有0和1两种!!)

如,3>2>1的值为1;若变量a中的值为10,变量b中的值为6,则关系表达式a>b的值为“真”,即为1。而关系表达式(a>5)<(b>10)的值为“假”,即为0。

第二节、逻辑运算符和逻辑表达式

1.1 C语言中的逻辑运算符

C语言提供了3种逻辑运算符,如表2所示。

表2  C语言中的3种逻辑运算符及其优先级

优先级

  优先级低      
             优先级高

逻辑运算符

|| (逻辑“或”)

&&(逻辑“与”)

! (逻辑“非”)

注意:

(1)&&和||运算符是双目运算符,如(a>b)&&(x<y)。!运算符是单目运算符,应该出现在运算对象的左边,如!(a<b)。逻辑运算符具有自左向右的结合性。

(2)在关系运算符、算术运算符、赋值运算符、逻辑运算符四者中,优先级从高到低依次为:! (逻辑“非”)、算术运算符、关系运算符、&&(逻辑“与”)、||(逻辑“或”)、赋值运算符。

1.2 逻辑表达式和逻辑表达式的值

逻辑表达式:用逻辑运算符将表达式连接起来的式子称为逻辑表达式。

逻辑运算的对象可以是C语言中任意合法的表达式。如,!(a<b),(a+b)&&(x=8),(a=b)||(c+2),'d'&&'c'等都是合法的表达式。

逻辑表达式的值:逻辑表达式的运算规则如表3所示。逻辑表达式的值若为真,则结果为1;若为假,则结果为0。(表达式的值也只有0和1两种!!!)

表3  逻辑运算的规则

A

b

!a

!b

a&&b

a||b

非0

非0

0

0

非0

0

非0

0

0

0

1

1

0

1

0

1

1

0

0

0

1

1

1

0

1设有定义:int a=5,b=6,c=7;则以下选项中值为0的表达式是

A)(!a==0)&&  (a<b<c)                B)(b<c)&&!c||1

C)a&&b                 
               D)(a+4)||( a+b)&&(c-a)

正确答案为A。

考试重点考察点

1、在C语言中,由&&||组成的逻辑表达式,在特定的情况下会产生“短路”的现象。在逻辑表达式的求解中,并不是所有的运算对象都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该逻辑运算符。(若“&&”的左边的运算对象的值为0,则不再对右边的运算对象进行运算,直接得出整个表达式的值为0;若“||”的左边的运算对象为1,则不再对右边的运算对象进行运算,直接得出整个表达式的值为1。)

(1)若执行下列语句

a=0;b=1;

c=a++&&(b=6);

各变量的值为:a为1,b为1,c为0,由于(b=6)没被执行到,故b的值不变。

(2)执行语句

a=1;b=1;c=0;

d=--a||b--||(c=b+3);

后,结果:a为0,b为0,c为0,d为1,表达式中的(c=b+3)没有被执行到,c值不变。

2、用C语言正确表示数学意义上的a<b<c,

正确的表示方法是 a<b&&b<c。因为a<b<c在C语言执行中,假定a=8,b=7,c=6,在数学中,a<b<c是不成立的。但是在C语言中,8<7<6会首先首先执行8<7得到0,再接着算0<6,这样就成合法了。所以一定注意C语言考试中这个a<b<c样子的是考试陷阱。

第三节  if语句

知识点:if语句的三种形式使用;if和else的搭配;嵌套的if语句的使用

重要程度:★★★★

1、if语句的三种形式

1.1 if语句

if只管后面一个分号;要管多个用大括号把多个语句括起来。

程序1:

if(a<b)

{t=a;  a=b; 
b=t;}

--------------------------

程序2:

if(a<b)

t=a;  a=b; 
b=t;

程序1、2注意两者的区别 !!!

图1 
if语句的流程图

1.2 if-else语句

它的一般格式如下:

if(表达式)

语句1;

else

语句2;

例如:对两数大小的比较,输出大数。用if-else语句实现:

if(x>y)

printf(“%d”,x);

else

printf(“%d”,y);

图2 
if-else语句的流程图

1若有以下程序

main( )

{

int   a=5,b=4,c=6,t=0;

if(a<b) {t=a;a=b;b=t;}

if(a<c) t=a;a=c;c=t;

printf("%d %d
%d\n",a,b,c);

}

执行后输出结果是

答案:645

分析:程序的第一行在定义a、b、c、t四个变量时初始化了值。接下来,第一个if语句的表达式为:a<b,a变量里存放的是整数5,b变量里存放的是整数4,可以判断该表达式为“假”,那么程序应该跳过if的子句。子句是一条复合语句则{t=a;a=b;b=t;}被跳过。第二个if语句的表达式为:a<c,因为变量a的值为5,变量c的值为6,因此该表达式的值为“真”,执行该if的语句“t=a;”,t的值被赋为5。该if语句执行完成后,还有两个其它的语句“a=c;c=t;”执行后这两条语句后,a的值被赋为6,c的值被赋为5。因此,最后输出a、b、c变量的值应该分别为6、4、5。若将if(a<b) {t=a;a=b;b=t;}改为if(a<b) t=a;a=b;b=t;,请读者自行分析结果。

1.3 if-else-if 语句结构

它的一般格式如下:(只有一个语句被执行)

if(表达式1)

语句1;

else if(表达式2)

语句2 ;

else if(表达式3)

语句3 ;

……

else

语句n ;

图2 
if-else-if 语句的流程图

2有如下程序

main( )

{ float x=2.0,y;

if(x<0.0) y=0.0;

else if(x<10.0) y=1.0/x;

else y=1.0;

printf("%f\n",y);

}

该程序的输出结果是( )。

A) 0.000000   B) 0.250000   C)
0.500000   D) 1.000000

分析:首先x的初值为2.0。判断x<0.0,其为假,则跳过语句“y=0.0;”,接着又判断x<10.0,其为真,则执行“y=1.0/x;”,然后将其输出。因此答案选C。

注意:

(1)if后面圆括号中的表达式,可以是任意合法的C语言表达式,可以是任意类型的数据。

(2)if子句和else子句中如果只有一条语句,则该语句后的分号不能省。

2、if语句的嵌套(概念考得多)

if语句的嵌套:在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:

if(表达式1)

if(表达式2)  语句1;

else       
语句2;

else

if(表达式3)  语句3;

else         语句4;

其执行过程:若表达式1为“真”,则执行其嵌套的if-else语句,否则,执行else后的内嵌if-else语句。其中if-else语句在语法上是一条语句。

特别注意:C语言的语法规定:else子句总是与前面最近的不带elseif相结合,与书写格式无关。

 
 

如下面语句:

if(表达式1)

if(表达式2)  语句1;

else        语句2;

实质上等价于:

if(表达式1)

if(表达式2)  语句1;

else        语句2;

 

 

 

 

 

 

 

 

 

 

第四节  条件运算符与条件表达式

知识点:条件运算符号的使用(唯一的三目);条件表达式的运算;

重要程度:★★★★(口诀是“真前假后”

1、条件运算符

条件运算符由两个运算符组成:。条件运算符要求有三个运算对象,称三目运算符,它是C语言中唯一的一个三目运算符。

2、条件表达式(“真前假后”口诀)

表达式1 ? 表达式2:表达式3

其执行过程:先求解表达式1,若为非0(真)则求解表达式2,并将表达式2的值作为整个表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个表达式的值。

 

1以下程序的输出结果是( )。
main()
{

int a=5,b=4,c=6,d;
 printf("%d\n",d=a>b?(a>c?a:c):(b));
}
A) 5   B)
4   C) 6   D)
不确定

分析:这是一个条件表达式的嵌套,先判断a>b为“真”,则需要求解表达式a>c?a:c的值。因此又对a>c进行判断,其为“假”,那么c就是整个表达式的值。答案选C。

3、条件运算符的优先级

条件运算符优先于赋值运算,但低于逻辑运算,关系运算符和算术运算符。条件运算符的结合方向为“自右向左”。如有以下表达式:

a>b?a:c>d?c:d               等价于            a>b?a:(c>d?c:d)

如果a=1,b=2,c=3,d=4,则表达式的值等于4。

第四节 switch语句及其构成的选择结构

知识点:switch语句的执行方式;switch语句和 break的搭配;

重要程度:★★★★

1、switch语句

switch语句的一般形式如下:

switch(表达式)

{     case  常量表达式1:语句1;

case  常量表达式2:语句2;

……

case  常量表达式n:语句n;

default: 语句块n+1;

}

其中语句1,语句2等等,可以是一条语句,也可以是若干语句。也可以是嵌套的switch语句。

注意:

(1)switch后圆括号中的表达式的值必须是实型或字符型,不能为实型

(2)case后面是常量表达式,但常量表达式中不能有变量

(3)default可以出现在语句体中的任何位置,但最多只能有一个。它通常出现在语句体的最后。

2、switch语句的执行过程

首先求解switch后圆括号中表达式的值,然后匹配case标号,有匹配成功则执行后面语句,只需要匹配一次成功,后面就不用再匹配了。(通过三个例子掌握switch的使用!)

1按照学生的考试成绩,打印出相应的等级。90分以上的输出“A”等级,80分以上的输出“B”等级,依此类推,60分以下输出“E”等级。程序如下:

main( )

{     int score;

scanf("%d",&
score);   /* score中存放学生的成绩 */

printf("score=%d:
",score);

switch(score/10)

{     case 10:printf("A\n");

case 9:printf("A\n");

case
8:printf("B\n");

case
7:printf("C\n");

case
6:printf("D\n");

default:printf("E\n");

}

}

输入99分,可以知道case 9 是匹配成功的,所以就不用再匹配,直接执行后面的case剩下的语句。直到遇到break结束。

现将上面程序修改如下:

main( )

{     int score;

scanf("%d",&score);

printf("score=%d:
",score);

switch(score/10)

{     case 10:printf("A\n");break;

case 9:printf("A\n");
break;

case
8:printf("B\n"); break;

case
7:printf("C\n"); break;

case
6:printf("D\n"); break;

default:printf("E\n");
break;

}

}

此时score变量取值为75时,输出结果为:score=75:C

现将上面程序修改如下:

main( )

{     int score;

scanf("%d",&score);

printf("score=%d:
",score);

switch(score/10)

{     case 10:printf("A\n");

case 9:printf("A\n");

case
8:printf("B\n");

case
7:printf("C\n"); break;

case
6:printf("D\n");

default:printf("E\n");
break;

}

}

此时score变量取值为95时,输出结果为:score=75:ABC.

考试核心:

1、 switch的概念题目非常重要,switch后圆括号中、case后的表达式的要求牢记。

2、 switch语句有break和没有break之间的区别,注意,只要匹配成功一次,后面不需要继续的匹配了,直接执行匹配的语句直到遇到break语句。

3、 switch嵌套switch的题目是考试的重点,请多次练习。

(1)以下程序运行后的输出结果是:2,1

main()

{

int x=1,y=0,a=0,b=0;

switch(x)

{

case 1: switch(y)

{case 0: a++; break;

case 1: b++; break;

}

case 2: a++;b++;break;

}

printf(”%d %d\n”,a,b);

}

(2)

有以下程序,程序运行后的输出结果是——A

A、1            B、2             C、3             D、4

main()

{

int a=15,b=21,m=0;

switch(a%3)

{

case 0: m++;break;

case 1: m++;

switch(b%2)

{default: m++;

case 0: m++; break;

}

}

printf(”%d\n”, m);

}

第五节  goto语句

知识点:goto是关键字;goto语句的含义;

重要程度:

1、goto语句

goto语句的作用是,无条件的把程序的执行转向语句标号所在的位置。滥用goto语句将使程序的流程毫无规律,可读性差,对于初学者来说应尽量不用。(记住这句话就可以了!)

goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。
如: label: i++;
loop: while(x<7);
C语言不限制程序中使用标号的次数,但各标号不得重名。goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。
goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
但是,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
.可以考虑使用goto的情形
1.从多重循环中直接跳出
很多人建议废除C++/C的goto语句,以绝后患。但实事求是地说,错误是程序员自己造成的,不是goto的过错。goto 语句至少有一处可显神通,它能从多重循环体中一下子跳到外面,用不着写很多次的break语句。例如:
for(......){
for(....){
for(.....){
// 如何冲出重重包围?
}
}
}
break;只能跳出单层的循环,return将整个函数都返回了,没法再继续了,显然也不行,所以我们想到了goto。如果是在陷入了很深层次的循环里想要跳出最外层的循环,用 goto 直接跳出却比用 break 一个循环一个循环地跳出要好得多。有人甚至形象比喻说:“就像楼房着火了,来不及从楼梯一级一级往下走,可从窗口跳出火坑。” 其实,你可以将 break 和 continue 理解成弱化了的 goto 语句。
2. 出错时清除资源
如果一个函数有多个出口,则在每个出口处,会产生巨大的退出代码,如下例一,每个函数只能有一个出口,所有的资源释放必须放在出口统一解决,那全部使用大括号,十几个,几十个if判断条件下来,你数数你的大括号有多深?这种代码可读性不好,一旦写错了,难于寻找错误。所有这些问题,一个goto就解决了。
当程序要分配和清除资源时(像内存、或处理字形、窗口、打印机),这种情形下用goto通常是为了复制代码或清除资源。若遇到这种情况,程序员就要掂量是 goto 的缺点令人讨厌呢?还是复制代码那令人头痛的维护更讨厌呢?最后还是认为 goto 的缺点更可忍受。

C语言之选择结构的更多相关文章

  1. 【C语言】-选择结构-if语句

    if语句:也可称条件语句,是根据所给定条件的值是真还是假决定执行不同的分支. if语句有单分支.双分支.多分支以及if语句的嵌套等多种形式. 单分支if语句: if (条件表达式) { 语句组1; } ...

  2. 【学习笔记】【C语言】选择结构-if

    1.if的第1种结构 if(条件) {     语句1;     语句2;     ...... } 如果if右边小括号()中的条件成立,也就是为“真”时,就会执行大括号{}中的语句: 如果条件为假, ...

  3. 【学习笔记】【C语言】选择结构-switch

    1.用法 switch(整型表达式) {     case 数值1:         语句1;         break;     case 数值2:         语句2;         br ...

  4. 李洪强漫谈iOS开发[C语言-035]-选择结构-与小结

  5. (十一)C语言之选择结构

  6. C语言----选择结构(基础篇三)

    大家好,忙里抽空更新一下自己的博客,算是自己的一个进步,C语言视频启蒙我早就看完啦,只是觉得这个视频真不错,所以给大家分享一下,同时自己还有很多没有理解透彻,写写博客算是一个笔记更是对自己所学的知识的 ...

  7. 160809209_李梦鑫_C语言程序设计实验2+选择结构程序设计_进阶

    <C语言程序设计>实验报告 学 号 160809209 姓 名 李梦鑫 专业.班 计科16-2班 学    期 2016-2017 第1学期 指导教师 黄俊莲 吴喆 实验地点 C05 机 ...

  8. C语言程序设计第三次作业--选择结构(1)

    Deadline: 2017-10-29 22:00 一.学习要点 掌握关系运算符和关系表达式 掌握如何判断两个实数相等 掌握常用数学函数的使用 掌握逻辑运算符和逻辑表达式 理解逻辑运算的短路特性 掌 ...

  9. C语言程序设计第四次作业--选择结构(2)

    (一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...

随机推荐

  1. 一款基于javascript的3D玻璃破碎特效

    之前为大家介绍了一款 html5 canvas实现图片玻璃碎片特效.今天要给大家带来一款基于javascript的3D玻璃破碎特效.效果图如下: 在线预览   源码下载 html代码: <div ...

  2. C语言 · 陶陶摘苹果

    算法提高 陶陶摘苹果   时间限制:1.0s   内存限制:256.0MB      问题描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出n个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个3 ...

  3. java继承2——类与继承(转)

    一.你了解类吗? 在Java中,类文件是以.java为后缀的代码文件,在每个类文件中最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在pu ...

  4. 等待事件 wait event

    衡量数据库状况, 优化数据库等 当一个进程连接到数据库后, 进程所经历的种种等待就开始被记录, 并且通过一系列的性能视图进行展示, 通过等待事件用户可以很快发现数据库的性能瓶颈, 从而进行针对性能的优 ...

  5. r语言 函数

    R语言实际上是函数的集合,用户可以使用base,stats等包中的基本函数,也可以自己编写函数完成一定的功能.但是初学者往往认为编写R函数十分困难,或者难以理解.这里对如何编写R函数进行简要的介绍. ...

  6. jquery 新建的元素事件绑定问题研究[转]

    原文:http://www.cnblogs.com/linzheng/archive/2010/10/17/1853568.html js的事件监听跟css不一样,css只要设定好了样式,不论是原来就 ...

  7. 如果分配给命令的连接位于本地挂起事务中,ExecuteNonQuery 要求命令拥有事务。命令的 Transaction 属性尚未初始化

    DbConnection dbc = database.CreateConnection(); DbTransaction dbtt = null; try { dbc.Open(); dbtt = ...

  8. 【JavaScript】使用setInterval()函数作简单的轮询操作

    轮询(Polling)是一种CPU决策怎样提供周边设备服务的方式,又称"程控输出入"(Programmed I/O). 轮询法的概念是.由CPU定时发出询问.依序询问每个周边设备是 ...

  9. 未能在当前目标框架中解析主引用“System.Net.Http”,它是一个框架程序集。“.NETFramework,Version=v4.0”。若要解决此问题,请移除引用“System.Net.Http”,或将应用程序的目标重新指向包含“System.Net.Http”的框架版本。 Zephyr.Web

    解决方法:升级项目到.net framework 4.5

  10. 转【翻译】怎样在Ubuntu 12.04上配置Apache SSL证书

    关于SSL证书 SSL证书是加密网站信息和创建一个更安全的连接的一种方式.另外,证书能够向网站訪问者展示VPS的身份信息. 证书颁发机构颁发SSL证书.用来验证server的具体信息,而一个自签名的证 ...