1,引例
说明:程序中用到了逻辑运算符“!”,含义是“非”。
2,关系运算符、逻辑运算符、条件运算符
1.关系运算符和关系表达式
关系运算符:关系运算符用于判断两个操作数的大小关系。在C语言中有6个关系运算符,如下表所示。
表1.关系运算符
运算符 | 含义 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
注意:
(1)关系运算符都是双目运算符,其结合方向是左结合。
(2)关系运算符的优先级低于算术运算符,但是高于赋值运算符。
(3)关系运算符中,>,<,>=、<=的优先级相同,==,!=的优先级相同,前者的优先级高于后者,即“>=”的优先级高于“==”。
关系表达式:用关系运算符将两个表达式连接起来的式子称为关系表达式。关系表达式的一般形
式为:
表达式1 关系运算符 表达式2
功能:比较两个表达式的大小,返回一个逻辑值。
例如:“a+b>=c-d”、“x<=3/2”、“'a'+1!=c”、“-i-5*j==k+1”都是合法的关系表达式。
关系表达式中允许出现嵌套的情况,例如:“a>(b>c)”、“a!=(c==d)”等。
注意: (1)注意区分运算符“=”和“==”。“=”是赋值运算符,“==”是关系运算符。
(2)对实数进行相等判断可能得不到正确的结果,例如“1.0/3*3.0==1.0”的结果为0。
(3)关系表达式中可以出现赋值运算符,如“a>(b=0)”,但是不能写成“a>b=0”的形
为0.
式。因为关系运算符的优先级高于赋值运算符,表达式“a>(b=o)”,但是不能写成“a>b=0”的形式。赋值运算符左边不是变量,会出现编译错误。
关系表达式主要用于分支结构中的条件判断。关系表达式的结果是一个逻辑值“真”或“假”,山于C语言中没有逻料类型的数据,因此用“1”表示“真”,“0”表示“假”。例如关系表达式“(a=3)>(b=8)”的值为0。
2.逻辑运算符和逻辑表达式 逻辑运算符:关系表达式只能描述单一的条件。对于较复杂的复合条件,例如“x小于10且x大于4”,如果用关系表达式“4<x<10”来描述,则当x=2时,由于关系运算符是左结合的。因此先计算“4<x”,其值为0;然后再计算“0<10”,其值为1;即说明当x=2时满足关系“4<x<10”,很显然是错误的。此时需要用到逻辑运算符将若干个关系表达式连接起来才能正确描述上述关系。逻辑运算符如下表所示:
表2.逻辑运算符
运算符 | ! | && | || |
---|---|---|---|
名称 | 逻辑非 | 逻辑与 | 逻辑或 |
结合性 | 右结合 | 左结合 | 左结合 |
优先级 | 高→→→→→→→→→→→→→→→→→低 |
注意:与运算符&&和或运算符||都是双目运算符,非运算符!为单目运算符。
逻辑表达式:用逻辑运算符将两个表达式连接起来的式子称为逻辑表达式。逻辑表达式的一般形
式为:
表达式1 逻辑运算符 表达式2
或 逻辑运算符表达式1
逻辑表达式的结果也是一个逻辑值“真”或“假”,即为“1”或“0”。逻辑运算的真值表如下表所示。
表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和0来判断他们是“真”或“假”。
(2)在逻辑表达式中也可以使用赋值运算符,如“a&&(b=0)”,但是不能写成“a&&b=0”的形式。因为逻辑运算符的优先级高于赋值运算符,表达式“a&&b=0”相当于“(a&&b)=0”,赋值运算符左边不是变量,会出现编译错误。
(3)C语言规定,只对决定整个表达式值所需的最少数目的子表达式进行运算。即在由若干个子表达式组成的逻辑表达式中,从左向右计算,当计算出一个子表达式的值就确定了整个逻辑表达式的值时,此后就不再计算右边剩下的子表达式的值,这种情况称为“短路”。
①对于逻辑与(&&)运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达式将不再进行计算;只有当“&.&.”左边的表达式值为真时才计算右边表达式的值。
②对于逻辑或(||)运算,若“||”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“||”右边的表达式将不再进行计算;只有当“||”左边的表达式值为假时才计算右边表达式的值。
表4.各种运算符的优先级从高到低的顺序
运算符 | ! | 算术运算符 | 关系运算符 | &&和|| | 赋值运算符 |
结合性 | 右结合 | 左结合 | 右结合 | ||
优先级 | 高→→→→→→→→→→→→→→→→→→→→→→→→→→→→低 |
3.条件运算符和条件表达式 条件运算符:条件运算符由“?”和“:”两个符号组成,用于条件求值,它是一个三目运算符,需要三个操作数。条件运算符的优先级低于逻辑运算符、高于赋值运算符,它是右结合的。
条件表达式:由条件运算符将3个表达式连接起来的式子称为条件表达式,其一般形式为:
表达式1?表达式2:表达式3
条件表达式的执行顺序是:先计算表达式1的值,若值为非0,表示条件为真,则将表达式2的值作为整个条件表达式的值,否则,将表达式3的值作为整个条件表达式的值。如
4>3?5:7的值为5
若已有声明“intx=4,y=3;”,则表达式x<y?x++:y++的值是3。
分析:对于条件表达式“x<y?x十十:y++”,先计算表达式“x<y”的值,结果为0,则将表达式“y++”的值,也就是3,作为条件表达式“x<y?x++:y++”的值,而变量y的值为4。
说明:
(1)条件表达式中表达式1的类型可以与表达式2和表达式3不同,表达式2和表达式3的类型也可以不同,此时系统会自动进行转换,结果为表达式2和表达式3中级别类型较高的,并将其作为条件表达式的类型,例如条件表达式“'a'?1:2.0”的结果为double型的1.0。
(2)条件表达式中表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表式,如“a>b?b=3:(c=4)”,但是不能写成“a>b?b=3:c=4”的形式。这是由于在表达式“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)”。
3,使用if-else实现分支结构 1.双分支if语句:其一般形式如下:
if(表达式)
语句1;
else
语句2; 双分支if语句流程图
2.单分支if语句:其一般形式如下:
if(表达式)
语句; 单分支if语句流程图
3.if语句的嵌套
if语句嵌套结构流程
4.多分支if语句
if(表达式1)
语句1;
else if(表达式2)
语句2; ……
else if(表达式n-1)
语句n-1;
else
语句n;
多分支结构流程
4,使用switch语句实现分支结构
在C语言中还提供了一种switch语句也可以实现多分支的选择。switch语句的一般形式如下:
switch(表达式)
{
case常量表达式1:语句1;break; case常量表达式2:语句2;break; ……
case常量表达式n:语句n;break;
default:语句n+1;break;
}
switch多分支结构执行流程
关于switch语句的几点说明:
(1)switch后的表达式可以是任何表达式,其值只能为整型、字符型、枚举型之一。
(2)每个case后面的常量表达式的值互不相同,否则就会出现互相矛盾的现象。
(3)各个case和default的出现次序不影响执行结果。
(4)可以让多个case共用一组执行语句。 (5)switch语句允许嵌套使用。
5,分支结构程序设计示例