4.1引例
例4.1
例4.2
4.2关系运算符、逻辑运算符、条件运算符
4.2.1关系运算符与关系表达式
1.关系运算符
关系运算符用于判断两个操作数的大小关系。在C语言中有6个关系运算符,如下
运算符 | 含义 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
注意
(1)关系运算符都是双目运算符,其结合方向是左结合
(2)关系运算符的优先级低于算术运算符,但是高于赋值运算符
(3)关系运算符中,>,<,>=,<=的优先级相同==,!=的优先级相同,前者的优先级高于后者即“>=”的优先级高于“”。
2.关系表达式
用关系运算符加两个表达是连接起来的式子称为关系表达式。关系表达式的一般形式为
表达式1关系运算符 表达式2
功能:
比较两个表达式的大小,返回一个逻辑值。
注意:
(1)注意区分运算符“=”和“”。“=”是赋值运算符,“==”是关系运算符。
(2)对实数进行相等判断可能得不到正确的结果。
(3)关系表达式中可以出现赋值运算符,因为关系运算符的优先级高于赋值运算符,赋值y运算符左边不是变量,会出现编译错误。
关系表达式主要用于分支结构中的条件判断。关系表达式的结果是一个逻辑值“真”或“假”,由于C语言中没有逻辑类型的数据,因此用“1”表示“真”,“0”表示“假”
例4.3
4.2.2逻辑运算符和逻辑表达式
1.逻辑运算符
关系表达式只能描述单一的条件。
运算符 | ! | && | || |
名称 | 逻辑非 | 逻辑与 | 逻辑或 |
结合性 | 右结合 | 左结合 | 左结合 |
优先级 |
注意:与运算符&&和或运算符||都是双目运算符,非运算符!为单目运算符。
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来判断他们是“真”或“假”。
(2)在逻辑表达式中也可以使用赋值运算符,因为逻辑运算符的优先级高于赋值运算符,赋值算符左边不是变量,会出现编译错误。
(3)C语言规定,只对决定整个表达式值所需的最少数目的子表达式进行运算。即在由若干个子表达式组成的逻辑表达式中,从主向右计算,当计算出一个子表达式的值就确定了整个逻辑表达式的值时,此后就不再计算右边剩下的子表达式的值,这种情况称为“短路”
对于逻辑与(&&)运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达式将不再进行计算;只有当“&&”左边的表达式值为真时才计算右边表达式的值。
对于逻辑或(||)运算,若“||”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“||”右边的表达式将不再进行计算;只有当“||”左边的表达式为假时才计算右边表达式值。
例4.5
算术运算符、关系运算符及逻辑运算符的优先级从高到低的顺序如下:
运算符 | ! | 算术运算符 | 关系运算符 | &&和|| | 赋值运算符 |
结合性 | 右结合 | 左 | 结 | 合 | 右结合 |
优先级 |
4.2.3条件运算符合条件表达式
1.条件运算符
条件运算符由“?”和“:”两个符号组成,用于条件求值,它是一个三目运算符,需要三个操作数。条件运算符的优先级低于逻辑运算符高于赋值运算符,它是右结合的。
2.条件表达式
由条件运算符将3个表达式连接起来的式子称为条件表达式,其一般形式为;
表达式1?表达式2:表达式3
条件表达式的执行顺序是:先计算表达式1的值,若值为非0,表示条件为真,则将表达式2的值作为整个条件表达式的值,否则,将表达式3的值作为整个条件表达式的值。
关于条件表达式的说明:
(1)条件表达式中表达式1的类型可以与表达式2和表达式3不同,表达式2和表达式3的类型也可以不同,此时系统会自动进行转化,结果为表达式2和表达式3中级别类型较高的,并将其作为条件表达式的类型。
(3)条件表达式中表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式,条件运算符的优先级高于赋值运算符。
(3)条件表达式允许嵌套。
例4.6
4.3使用if- else实现分支结构
4.3.1 if- else
1.双分支if语句
其一般表达式如下:
if(表达式)
语句1;
else
语句2;
其语义是首先求解表达式,如果表达式的值为“真”,则执行语句2;若表达式的值为“假”,则执行语句2,无论执行完语句1还是语句2,都会结束整个if语句的执行。
例4.7
例4.8
双分支if语句可以用条件表达式替换。当if语句中只给同一个变量赋值时,可以使用条件表达式代替if语句。
2.单分支if语句
其一般形式如下:
if(表达式)
语句;
双分支if- else语句中,若缺省了“语句2时”,则构成了单分支语句,执行流程图。其语义是首先计算表达式,如果表达式的值为“真”,则执行语句;否则不执行语句,直接执行if语句的下一语句。
例4.9
例4.10
无论在双分支还是单分支if语句的格式中,“表达式”都是用来描述判断的条件,语法上可以是任意类型的表达式。表达式的结果如果为“0”,表示“假”;结果为“非0”,则表示“真”。
无论在双分支还是单分支if语句的格式中,被执行的语句均为单个语句。如果想要执行一组语句时,则必须将这一组语句用{}括起来起来形成复合语句,但在“}”之后不能再加括号。注意,复合语句中的语句执行时会全部被执行。
例4.11
4.3.2if语句的嵌套
一个if语句中又包含一个或多个if语句的现象称为if语句的嵌套。
if语句的基本形式:
if(表达式)
语句1;
else
语句2;
其中“语句1”或“语句2”都可以嵌套另一个if语句,在缺省else部分的if语句中的“语句”,也可以嵌套另一个if语句。因此,具体嵌套形式可以有很多种。
在C语言中规定其对应原则是:else总是与它前面最近的一个未匹配的if相匹配。
例4.12
例4.13
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.14
例4.15
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语句允许嵌套使用。
1.在switch语句格式中的每个语句后面都使用break语句
例4.16
2.在switch语句格式中的部分语句后面使用break语句
例4.17
例4.18
3.在switch语句格式中不使用break语句
switch语句中不使用break语句时,程序在执行相应语句后,不会跳出正在执行的switch语句,而会继续执行其后的所有语句。
4.5分支结构程序设计示例
例4.19
例4.20
例4.21