选择控制结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有关关系运算符和其它运算符的优先次序
(1) 前四种关系运算符的 优先级别相同,后两 种相同 算术运算符 (高)
(2) 关系运算符的优先级 别低于算术运算符。 (3) 关系运算符的优先级 别高于赋值运算符。
关系运算符
赋值运算符
逗号运算符 (低)
§5.1.2 关系表达式
什么叫关系表达式:用关系运算符将两个表达式(可 以是算术表达式或关系表达式、逻辑表达式、赋值表达式、 字符表达式)连接起来的式子,就叫做关系表达式。
行过程是:若(a>b)条件为真,则条件表达式的值取a, 否则取b。 条件运算符要求有3个操作对象,称三目运算符。
其表达式的一般形式为:
表达式1 ? 表达式2 : 表达式3
真
表达式1
假
条件表达式 取表达式2的值
条件表达式 取表达式3的值
说 明
(1)条件运算符的执行顺序:先求解表达式1,若为
非0则求解表达式2,此时表达式2的值就是整个 条件表达式的值。若表达式1的值为0,则求解表 达式3,表达式3的值就是整修条件表达式的值。 max = (a > b) ? a : b
但可以用下面语句代替:
printf(“%d”,a>b?a:b);
即将条件表达的值输出。
(5) 条件表达式中,表达式1的类型可以与表达式2和
表达式3的类型不同。如: x ? ’a ’ : ’b ’ x是整型变量,若x=0,则条件表达式的值 为’b‟。表达式2和表达式3的类型也可以不同此
⑵
a || b || c
只要a为真(非0),
a
0假
非0(真)
就不必判断b和c;只有
b
0假
非0(真)
a为假,才判别b;a和b
都为假才判别c。见右
非0(真)
c
0假 0假
图所示
1真
也就是说,对&&运算符来说,只有a≠0,才 继续进行右面的运算。对运算符||来说,只有a=0, 才能继续进行其右面的运算。 如果有下面的逻辑表达式:当a=1,b=2,c=3,d=4, m和n的原值为1时,
若a=1,b=2,c=3,d=4,
则条件表达式的值等于4
(4)条件表达式不能取代一般的if语句,只有在if语
句中内嵌的语句为赋值语句(且两个分支都给同一
个变量赋值)时才能代替if语句。像下面的if语句
就无法用一个条件表达式代替。
if(a>b) printf(“%d”,a); else printf(“%d”,b);
5.2
逻辑运算符和逻辑表达式
用逻辑运算符将关系表达式和逻辑量连接起
来的式子就叫做逻辑表达式。在这一节中将主要
介绍如下两部分:
逻辑运算符及其优先次序 逻辑表达式
§5.2.1
逻辑运算符及其优先次序
C语言提供了如下三种逻辑运算符:
⑴ &&
⑵ ⑶ || !
逻辑与(相当于其他语言中的AND)
逻辑或(相当于其他语言中的OR) 逻辑非(相当于其他语言中的NOT)
if (a + b > c && b + c > a && c + a > b) { s = 0.5 * (a + b + c); area = sqrt(s * (s - a) * (s - b) * (s - c)); printf(“area=%6.2f”, area); } else { printf(“这三条边不能组成一个三角形。‛) ; }
5.3.3
条件运算符
若if语句中,在表达式为‚真‛和‚假‛时, 且都只执行一个赋值语句给同一个变量赋值时, 可以用简单的条件运算符来处理。例如:
if (a>b) max=a;
else
max=b;
这时可以用下面的条件运算符来处理:
max = (a>b) ? a : b;
下面对条件运算作详细介绍。
其中‚(a>b)?a:b”是一个‚条件表达式‛。它的执
第五章 选择结构程序设计
关系运算符和关系表达式
逻辑运算符和逻辑表达式 if 语句 switch语句
程序举例
§5.1 关系运算符和关系表达式
关系运算是逻辑运算中比较简单的一种。所谓
‚关系运算‛实际上是‚比较运算‛。将两个值进 行比较,判断其比较的结果是否符合给定的条件。
例如,a>3 是一个关系表达式,‚大于‛号是一个
2.if(表达式)语句1else 语句2
例如: if (x > y) { printf(“%d”, x); } else { printf(“%d”, y); } 一般把这种语句称为:
真
表达式
假
语句1
语句2
if~else语句
见右图
3.if( 表达式1) 语句1
else if(表达式2) 语句2
else if(表达式3)
(m=a>b)&&(n=c>d)
求表达式计算完毕后,n=? 由于‚a>b”的值为0,因此m=0,而‚n=c>d” 不被执行,因此,n的值不是0而仍保持原值1。
§5.3 if 语句
if 语句是用来判定所给定的条
件是否满足,根据判定的结果(真或
假)决定执行给出的两种操作之一。
§5.3.1
if 语句的三种形式
那么当有: a > b ? a : b +1 个表达式和上式效果一样?
分析下面哪一
a > b ? a : (b +1 ) 和 (a > b ? a : b )+1
(3) 条件运算符的结合方向‚自右向左‛。如果有以 下条件表达式:
a > b ? a : c > d ? c : d
相当于:
a > b ? a :( c > d ? c : d )
应当注意if和else的配对关系。else总是 和它上面最近的if配对。如下写法是错误的:
if ( ) if ( ) else if ( ) else
语句1 语句2 语句3
主观上想作为if块
主观上想作为else块
编程者的原意是想把else写在与第一个if(外层
if)同一列上,希望else与第一个if对应,但实际上 else是和第二个if配对,因为它们俩相距最近。不能 只考虑自己的主观意愿,而不顾if嵌套的规则。
C语言提供了三种形式的if语句,将 在下面作详细介绍。由于if语句在编程中 使用的频率很高,所以要求同学们认真学 习、熟练掌握。
1.if(表达式) 语句
例如:
if (x > y) { printf(“%d”,x);
假(0)
}
这种if语句的执行过程见右图。
表达式
真(非0)
此语句亦称为:
语句
简单if语句
要求if的数目和else数目相同,从内层到外层一 一对应,不致出错。若if和else的数目不一样,为实 现程序设计者的目的,可加花括号来确定配对关系。
例如:
if ( ) { if ( ) 语句1 } else 语句2 (内嵌if)
这样{ }就限定了内嵌if语句的范围。此时else 和第一个if配对。(注:上例中包含了两种if语句的 形式)。
关系运算符,若 a 的值为5,则满足给定的‚a>3”
条件,因此关系表达的值为‚真‛;若 a 的值为 2,
不满足‚a>3”条件,则称关系表达式的值为‚假‛。
§5.1.1 关系运算符及其优先次序
① <
②
(小于)
< = (小于或等于) 优先级别相同 (高)
③ >
④ ⑤ ⑥
(大于)
> = (大于或等于) = = (等于) ! = (不等于) C语言提供的6种关系运算符 优先级别相同 (低)
实际上,逻辑运算符两侧的运算对象不但可以
是0和1,或是0和非0的整数,也可以是任何类型的
数据。可以是字符型、实型或指针型等。系统最终
以0和非0来判定它们属于‚真‛或‚假‛。例如:
‘c’ && ’b’
该表达式的值为1。(为什么?)
在逻辑表达式的求解中,并不是所有的逻辑运 算符都被执行,只是在必须执行下一个逻辑运算符 才能求出表达式的解时,才执行该运算符。请看下 面的解释:
关系运算符
&&和|| 赋值运算符 逗号运算符 (低)
(a= =b)||(x= =y)可写为a= =b||x= =y
(!a)||(a>b)
可写为 !a||a>b
5.2.2
逻辑表达式
如前所述,逻辑表达式的值应该是一个逻 辑量‚真‛或‚假‛。C语言编译系统在给出 逻辑运算结果时,以数值1代表‚真‛,以0代 表‚假‛,但在判断一个量是否为‚真‛时, 以0代表‚假‛,以非0代表‚真‛。即将一个
if(3) printf(“ok!”);
该语句是合法的,执行结果输出‚ok!”,因为 表达式的值为3,按‚真‛处理。由此可见,表达式 的类型不限于逻辑表达式,可以是任意的数值类型。
(2)第二、第三种形式的if语句中,在每个else前有一个分号, 整个语句结束处有一分号。例如:
if(x>0) { printf(“%f”,x); } else { printf(“%f”,-x); }
!a
若a为真,则!a为假。
若在一个逻辑表达式中包含多个逻辑运算符时, 如:!a && b || x > && c 按如下的优先次序:
⑴ (高) ! → &&→ ||
(低)
! (非) 算术运算符
Βιβλιοθήκη Baidu
(高)
⑵ 逻辑运算符中的‚&&”和‚||”低于 关系运算符,‚!”高于算术运算符。 (a>b)&&(x>y) 可写为 a>b&&x>y
关系表达式的值是一个逻辑值,即‚真‛或‚假‛。例 如:‚5 == 2 ”的值为‚假‛,‚6 >= 0”的值为‚真‛。C 语言没有逻辑型数据,以‚1”代表‚真‛,以‚0”代表 ‚假‛。
例如,a = 3, b = 2, c = 1
关系表达式‚a>b”的值为‚1”。 关系表达式‚(a > b) == c”的值为‚1”。因为‚a > b” 的值为‚1”,等于c的值,所以结果为‚1”。
执行结果就是将条件表达式的值赋给max。
也就是将a和b二者中大者赋给 max 。
(2) 条件运算符优先于赋值运算符,因此上面赋值表
达式的求解过程是先求解条件表达式,再将其值赋 给max。
条件运算符的优先级别比关系运算符和算术运 算符都低。因此有:
max = (a > b) ? a : b 可写成 max = a > b ? a : b
各有一个分号
这是由于分号是C语言中不可缺少的部分,这个分号是if语句 中的内嵌语句所要求的。如果无此分号则出现语法错误。但应 注意,不要误认为上面是两个语句(if语句和else语句)。它们 都属于同一个if语句。else子句不能作为语句单独使用,它 必须是if语句的一部分,与if配对使用。
(3)在if和else后可只含一个内嵌的操作语句,也可有多 个操作语句,若有多个操作语句时需要有花括号‚{}” 将几个语句括起来成为一个复合语句。例:
注意花括号‚}” 外面不需要再加分号。因为{}内是一 个完整的复合语句,不需要另附加分号。
5.3.2 if
语句的嵌套
在 if 语句中又含一个或多个 if 语句叫嵌套。
if ( )
if ( ) 语句1
else
else
语句2 语句3
语句4
内嵌if (if块)
if ( )
else
内嵌if (else块)
非零的数值认作为‚真‛。具体说明如下:
⑴ 若a=4,则!a的值为0。
⑵ ⑶ ⑷ ⑸ 若a=4,b=5,则a&&b的值为1。
a、b的值同上,a||b的值为1。 a、b的值同上,!a||b的值为1。 4&&0||2的值为1。
通过上述几个例子可看出,由系统给出的逻辑运 算结果不是0就是1 ,不可能是其他数值。而在逻辑 表达式中作为参加运算的运算对象可以是0“假‛或任 何非0数值。如果在一个表达式中不同位置上出现数 值,应区分哪些是作为数值运算或关系运算对象,哪 些作为逻辑运算对象。
(1)
a && b && c
只有a为真 (非0)时, a
0(假) 非0(真) 0(假)
才需要判别b的值,只有a 和b都为真的情况下才需要 判别c的值。只要a为假, 就不必判别b和c(此时整个 表达式已确定为假)。如果 c b
非0(真) 0(假) 非0(真) 1真 0(假)
a为真,b为假,不用判别
c 。见右图。
“&&”和‚||”是‚双目运算符‛,它要求 有两个运算量(操作数)。 例(a > b) && (x > y),(a > b) || (x > y) “! ”是‚单目运算符‛,只有一个运算量, 例如 !(a>b)
a && b 若a、b为真,则a&&b为真。
a || b 若a、b之一为真,则a || b 为真。
┇
语句3 语句m
else if(表达式m)
else 语句n
假 表达式1
真
表达式2 真
假
表达式3 真 假 假
表达式4 真
语句1
语句2
语句3
语句4
语句5
有关if语句的说明
(1)三种形式的if语句中在if后面都有‚表达式‛, 一般为逻辑表达式或关系表达式。在执行if语 句时先对表达式求解,若表达式的值为0,按 ‚假‛处理,若表达式的值为非0,按‚真‛处 理,执行指定的语句。假如有如下if语句: