4.1引例
4.2关系运算符、逻辑运算符、条件运算符
4.2.1关系运算符和关系表达式
1关系运算符
关系运算符用于判断两个操作数的大小关系。
关系运算符
运算符 | 含义 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
注意:(1)关系运算符都是双目运算符,其结合方向是左结合。
(2)关系运算符的优先级低于算术运算符,但是高于赋值运算符。
(3)关系运算符中,>、<、>=、<=的优先级相同,==、!=的优先级相同,前者优先级高于后者优先级,即“>="的优先级高于”==“。
2关系表达式
表达式1 关系运算符 表达式2
功能:比较两个表达式的大小,返回一个逻辑值。
注意:
(1)注意区分运算符“一”和“==”。“一”是赋值运算符,“==”是关系运算符。
(2)对实数进行相等判断可能得不到正确的结果,例如“1.0/3*3.0==10”的结果为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逻辑运算符和逻辑表达式
逻辑运算符
运算符 | ! | && | || |
名称 | 逻辑非 | 逻辑与 | 逻辑或 |
结合性 | 右结合 | 左结合 | 左结合 |
优先级 | 高 | 到 | 低 |
注意:与运算符&&和或运算符||都是双目运算符,非运算符!为单目运算符
2逻辑表达式
用逻辑运算符将两个表达式连接起来的式子称为逻辑表达式。其一般形式为:
表达式1 逻辑运算符 表达式2 逻辑运算符 表达式1
用逻辑表达式的结果也是一个逻辑值“真”或“假”,即为“1”或“0”
逻辑运算的真值表
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和0来判断他们是“真”或“假”。
(2)在逻辑表达式中也可以使用赋值运算符,如“a&&(b=0)”,但是不能写成“a&&1 -0”的形式。因为逻辑运算符的优先级高于赋值运算符,表达式“a&&b-0”相当于“(a&&b)=0”,赋值运算符左边不是变量,会出现编译错误。
(3)C语言规定只对决定整个表达式值所需的最少数目的子表达式进行运算。即在由若于个子表达式组成的逻辑表达式中,从左向右计算,当计算出一个子表达式的值就确定整个逻辑表达式的值时此后就不再计算右边剩下的子表达式的值,这种情况称为“短路”。
①对于逻辑与(&&)运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达式将不再进行计算;只有当“&&”左边的表达式值为真时才计算右边表达式的值。
②对于逻辑或(1/)运算,若“11”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“1/”右边的表达式将不再进行计算;只有当“|”左边的表达式值为假时才计算右边表达式的值。
各种运算符的优先级从高到低的顺序
运算符 | ! | 算术运算符 | 关系运算符 | &&和|| | 赋值运算符 |
结合性 | 右结合 | 左 | 结 | 合 | 右结合 |
优先级 | 高 | 到 | 低 |
逻辑表达式举例:
①ch是英文字母。逻辑表达式为(ch>=a && ch<='z')||(ch >='A'&&. ch
=Z')。
②ab不同时为0。逻辑表达式为!(a==08&b==0)或a!=0||b!=0或allb。
③ch是空格或回车。逻辑表达式为(ch-= '(ch=='\n)。
④year是闰年,即year能被4整除但不能被100整除,或year能被400整除。逻辑表达式为(year%4==0&&year%100!=0)l(ye ar%400==0)。
4.2.3 条件运算符和条件表达式
1、条件运算符
条件运算符由“?”和:”两个符号组成,用于条件求值,它是一个三目运算符,需要三个操作数。条件运算符的优先级低于逻辑运算符、高于赋值运算符,它是右结合的。
2条午表达式
由条件运算符将3个表达式连接起来的式子称你为条件表达式,其一般形式为:
表达式1?表达式2 表达式3
条件表达式的执行顺序是:先计算表达式1的值,若值为非0,表示条件为真,则将表达式2的值作为整个条件表达式的值,否则,将表达式3的值作为整个条件表达式的值。
关于条件表达式的说明:
(1)条件表达式中表达式1的类型可以与表达式2和表达式3不同、表达式2和表达式3的类型也可以不同,此时系统会自动进行转换,结果为表达式2和表达式3中级别类型较高的,并将其作为条件表达式的类型。例如条件表达的1.0。
数值表达式,还可以是赋值表达式或
(2)条件表达式中表达式2和表达式3不仅可以是
b?b=3:c=4”的形式。这是由于在
数表达式,如“a>b?b=3(c=4)”,但是不能写成“a>
表达式“a>b?b=3:c=4”中,条件运算符的优先级高于赋值运算符,上述表达式相当于“(a>b?b=3:c)=4”,因赋值运算符左边不是变量,所以会出现编译错误。
(3)条件表达式允许嵌套,例如“a>3?b:c>2?1:0”,根据条件表达式的结合性,它相当于“a>3?b:(c>2?1:0)
4.3使用if-else实现分支结构
4.3.1 if-else语句
if(表达式)
语句1
else
语句2
2单分支if语句
其一般形式:if(表达式)
语句
4.3.2if语句的嵌套
使用i语句的基本形式解决分支少于两个的问题十分方便。而经常遇到的是多于两个分支。或者需要在多个不同条件下执行不同语句的问题。这就需要掌握“语句的嵌套以及多分支结构。
一个语句中又包含一个或多个if语句的现象称为if语句的嵌套。易语甸的基本形式:6(表达式)语句1s else
语句2:
其中“语句1或“语句2”都可以嵌套另一个if语句,在缺省else部分的if语句中的“语句”它可以嵌套另一个f语句。因此,具体假套形式可以有很多种。如
表达式1)表达式2)
4.3.3
if(表达式)
语句1;
else if(表达式n-1)
语句n-1
else
语句n:
4.4使用switch语句实现分支结构
在语言中还提供了一种switch语句也可以实现多分支的选择。 switch语句的一般形式如下: switch(表达式)
case常量表达式1:语句1:break: case常量表达式2:语句2:break;
case常量表达式n:语句n;break; default:语句n+1:break:
witch语句多分支结构执行流程如图46所示。其执行过程为:首先计算switch后面括号内的表达式、然后将表达式的值从上到下按顺序与各个case后面的常量表达式的值进行比较若与某个常量表达式的值相等,则执行该常量表达式后面的语句然后执行break语句,跳出swttch语句:switch语句执行结束:如果表达式的值与任何一个常量表达式的值都不相等,则执行defaul!后的语句,结束switch 语句的执行。
表运式的值常益表达式的值
语句1 break
表达式的值"常量表达式的值
语句2 break
表达式的值常量表达式。的值
语n brcak
语可n1 break
到46mwiich多分支结构执行健器
关于switch 请句的几点说明:
(Dih后的表达式可以是任何表达式,其值只能为整型、字符型、枚孝型(见9.8节)之一(2)每个ca后面的常量表达式的值互不相同,否则就会出现互相矛质的现象。3各个cave和defaui的出现次序不影响执行结果。(4)可以让多个case共用一组执行语句。在语言中还提供了一种switch语句也可以实现多分支的选择。 switch语句的一般形式如下: switch(表达式)
case常量表达式1:语句1:break: case常量表达式2:语句2:break;
case常量表达式n:语句n;break; default:语句n+1:break:
witch语句多分支结构执行流程如图46所示。其执行过程为:首先计算switch后面括号内的表达式、然后将表达式的值从上到下按顺序与各个case后面的常量表达式的值进行比较若与某个常量表达式的值相等,则执行该常量表达式后面的语句然后执行break语句,跳出swttch语句:switch语句执行结束:如果表达式的值与任何一个常量表达式的值都不相等,则执行defaul!后的语句,结束switch 语句的执行。
表运式的值常益表达式的值
语句1 break
表达式的值"常量表达式的值
语句2 break 表达式的值常量表达式。的值
语n brcak
语可n1 break
到46mwiich多分支结构执行健器
关于switch 请句的几点说明:
后的表达式可以是任何表达式,其值只能为整型、字符型、枚孝型之一(2)每个ca后面的常量表达式的值互不相同,否则就会出现互相矛质的现象。3各个cave和defaui的出现次序不影响执行结果。(4)可以让多个case共用一组执行语句。(5)switch语句允许嵌套使用。
4.5分支结构程序设计示例