4.2关系运算符、逻辑运算符、条件运算符
4.2.1关系运算符和关系表达式
1.关系运算符
表4.1关系运算符
运算符………………………………………含义
……………………………………………大于
=………………………………………大于等于
<……………………………………………小于
<=………………………………………小于等与
==……………………………………………等于
!=………………………………………不等于
注意:
(1)关系运算符都是双目运算符,其结合方向是左结合。
(2)关系运算符的优先级低于算术运算符,但是高于赋值运算符。
(3)关系运算符中,>,<,>=,<=的优先级相同,、!=的优先级相同,前者的优先级高于后者,即“>=”的优先级高于“”。
2.关系表达式
用关系运算符将两个表达式连接起来的式子称为关系表达式。关系表达式的一般形式为
表达式1关系运算符表达式2
功能:比较两个表达式的大小,返回一个逻辑值。
例如:“a+b>=c-d”,“x<=3/2”、“‘a’+1!=c”`“-i-5*j==k+1”都是合法的关系表达式。
注意:
(1)注意区分运算符“=”和“”。“=”是赋值运算符,“”是关系运算符。
(2)对实数进行相等判断可能得不到正确的结果,例如“1.0/3*3.0==1.0”的结果为0。
(3)关系表达式中可以出现赋值运算符,如“a>(b=0)”,但是不能写成“a>b=0”的形式。因为关系运算符的优先级高于赋值运算符,表达式“a>b=0”相当于“(a>b)=0”,赋值运算符左边不是变量,会出现编译错误。
关系表达式主要用于分支结构中的条件判断。关系表达式的结果是一个逻辑值“真”或“假”,由于C语言中没有逻辑类型的数据,因此用“1”表示“真”,“0”表示“假”。例如关系表达式“(a=3)>(b=8)的值为0”
4.2.2逻辑运算符和逻辑表达式
1.逻辑运算符
表4.2 逻辑运算符
运算符…………!…………&&…………||
名称…………逻辑非………逻辑与……逻辑或
综合性………右结合………左结合……左结合
优先级……高———————————→低
注意:与运算符&&和或运算符||都是双目运算符,非运算符!为单目运算符。
2.逻辑表达式
用逻辑运算符将两个表达式连接起来的式子称为逻辑表达式 。逻辑表达式的一般形式为:
或 表达式1逻辑运算符 表达式2
逻辑运算符 表达式1
逻辑表达式的结果也是一个逻辑值“真”或“假”,即为“1”或“0”。逻辑运算的真值表如表4.3所示。
表4.3 逻辑运算的真值表
x………y………!x………x&&y………x||y
0………0………1…………0……………0
0………非0……1…………0……………1
非0……0………0…………0……………1
非0……非0……0…………1……………1
关于逻辑表达式的说明:
(1)参与逻辑运算的数据可以是1和0,也可以是非零值和零,还可以是任何类型的数据,但最终都是以非0和0来判断他们是“真”或“假”。
(2)在逻辑表达式中也可以使用赋值运算符,因为逻辑运算符的优先级高于赋值运算符,赋值运算符左边不是变量,会出现编译错误。
(3)C语言规定,只对决定整个表达式值所需的最少数目的子表达式进行运算。即在由若干个子表达式组成的逻辑表达式中,从主向右计算,当计算出一个子表达式的值就确定了整个逻辑表达式的值时,此后就不再计算右边剩下的子表达式的值,这种情况称为“短路”对于逻辑与(&&)运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达式将不再进行计算;只有当“&&”左边的表达式值为真时才计算右边表达式的值。对于逻辑或(||)运算,若“||”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“||”右边的表达式将不再进行计算;只有当“||”左边的表达式为假时才计算右边表达式的值。算术运算符、关系运算符及逻辑运算符的优先级从高到低的顺序如下:!到算术运算符到关系运算符到赋值运算符到&&和||结核性:!为右结合、算术运算符为左结合、关系运算符为左结合、&&和||为左结合、赋值运算符为右结合
4.2.3条件运算符合条件表达式
1.条件运算符条件运算符由“?”和“:”两个符号组成,用于条件求值,它是一个三目运算符,需要三个操作数。条件运算符的优先级低于逻辑运算符高于赋值运算符,它是右结合的。
2.条件表达式由条件运算符将3个表达式连接起来的式子称为条件表达式,其一般形式为;表达式1?
表达式2:表达式3条件表达式的的执行顺序是:先计算表达式1的值,若值为非0,表示条件为真,则将表达式2的值作为整个条件表达式的值,否则,将表达式3的值作为整个条件表达式的值。
关于条件表达式的说明:
(1)条件表达式中表达式1的类型可以与表达式2和表达式3不同,表达式2和表达式3的类型也可以不同,此时系统会自动进行转化,结果为表达式2和表达式3中级别类型较高的,并将其作为条件表达式的类型。
(2)条件表达式中表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式,条件运算符的优先级高于赋值运算符。
(3)条件表达式允许嵌套。
4.3使用if- else实现分支结构
4.3.1 if- else语句
1.双分支if语句其一般表达式如下:if(表达式)语句1;else语句2;其语义是首先求解表达式,如果表达式的值为“真”,则执行语句2;若表达式的值为“假”,则执行语句2,无论执行完语句1还是语句2,都会结束整个if语句的执行。双分支if语句可以用条件表达式替换。当if语句中只给同一个变量赋值时,可以使用条件表达式代替if语句。
2.单分支if语句其一般形式如下:if(表达式)语句;双分支if- else语句中,若缺省了“语句2时”,则构成了单分支语句,执行流程图。其语义是首先计算表达式,如果表达式的值为“真”,则执行语句;否则不执行语句,直接执行if语句的下一语句。无论在双分支还是单分支if语句的格式中,“表达式”都是用来描述判断的条件,语法上可以是任意类型的表达式。表达式的结果如果为“0”,表示“假”;结果为“非0”,则表示“真”。无论在双分支还是单分支if语句的格式中,被执行的语句均为单个语句。如果想要执行一组语句时,则必须将这一组语句用{}括起来起来形成复合语句,但在“}”之后不能再加括号。注意,复合语句中的语句执行时会全部被执行。
4.3.2if语句的嵌套
一个if语句中又包含一个或多个if语句的现象称为if语句的嵌套。
if语句的基本形式:if(表达式)语句1;else语句2;其中“语句1”或“语句2”都可以嵌套另一个if语句,在缺省else部分的if语句中的“语句”,也可以嵌套另一个if语句。因此,具体嵌套形式可以有很多种。在C语言中规定其对应原则是:else总是与它前面最近的一个未匹配的if相匹配。4.3.3多分支if语句多分支if语句是最常用的实现多路分支的方法,其一般形式如下:if(表达式1)语句1;if(表达式2)语句2;if(表达式n-1)语句n-1;else语句n;首先求解表达式1,如果表达式的值为“真”,则执行语句1,并结束整个if语句的执行;否则,求解表达式2,…,若表达式1至表达式n-1的值都为“假”时,执行语句n。
4.4使用switch语句实现分支结构
在C语言中还提供了一种switch语句也可以实现多分支的选择。
其语句的一般形式如下:switch(表达式){case常量表达式1:语句1;break;case常量表达式2:语句2;break;…case常量表达式n:语句n;break;default:语句n+1;break;}switch语句执行结果其执行过程为:首先计算switch后面括号内的表达式,然后将表达式的值从上到下按顺序与各个case后面的常量表达式的值进行比较,若与某个常量表达式的值相等,则执行该常量表达式后面的语句,然后执行break语句,跳出switch语句,switch语句执行结束;如果表达式的值与任何一个常量表达式的值都不相等,则执行default后的语句,结束语句switch的执行。
关于switch语句的几点说明:
(1)switch后的表达式可以是任意表达式,其值只能为整形、字符型、枚举型之一。
(2)每个case后面的常量表达式的值互不相同,否则就会出现互相矛盾的现象。
(3)各个case和default的出现次序不影响执行结果。
(4)可以让多个case共用一组执行语句。(5)switch语句允许嵌套使用。在switch语句格式中的每个语句后面都使用break语句在switch语句格式中的部分语句后面使用break语句在switch语句格式中不使用break语句switch语句中不使用break语句时,程序在执行相应语句后,不会跳出正在执行的switch语句,而会继续执行其后的所有语句。
4.5分支结构程序设计示例