C语言的语法基础

2.3.3关系、逻辑及条件运算

 

    1.关系运算

(1)关系运算符

关系运算符用于比较两个运算对象的大小。C语言提供六种关系运算符:

<(小于),>(大于),<=(小于或等于),>=(大于或等于)

这四个运算符优先级相同,但都高于下面两种关系运算符;

==(等于),!=(不等于)

这两个运算符优先级也相同,都低于上面四种关系运算符。关系运算符是双目运算符,结合方向是“从左到右”。 关系运算符的优先级低于算术运算符,但高于赋值运算符。

(2)关系表达式

用关系运算符把C的合法表达式联系起来就构成了关系表达式。这里的合法表达式可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、逗号表达式、字符表达式等。通常关系表达式的值为一个逻辑值,“真”或“假”。C语言中没有专门用来表示“真”、“假”的常量,在C语言中的非零值认为是“真”,零则认为是“假”。关系表达式的值只能是1或0。关系表达式值为1,称该关系表达式为“真”;若关系表达式值为0, 则称该关系表达式为“假”。例如:

123>=456        值为0

1>(123>456)  值为1

'A'<'a'            值为1

    2.逻辑运算

(1)逻辑运算符

C语言提供三种逻辑运算符:   && (逻辑与), (逻辑或), ! (逻辑非)。

其中“!”是单目运算符,“&&”和“”是双目运算符。逻辑运算符的优先级如图2.7。

“!” → 算术运算符 → 关系运算符 → “&&” → “” → 赋值运算符

 


       高                                                                                                               低

                             图2.7  逻辑运算符的优先级

逻辑非“!”运算符的结合方向是“从右到左” ,而“&&”和“” 结合方向则是“从左到右”。

(2)逻辑表达式

用逻辑运算符把合法的C语言表达式联系起来就构成了逻辑表达式。C语言中逻辑表达式的值也只能是1或0。逻辑表达式值为1,则称该逻辑表达式为“真”;若逻辑表达式值为0,则称该逻辑表达式为“假”。逻辑表达式的运算规则如表2.15,其中a,b为合法的C语言表达式。

表2.15  逻辑表达式的运算规则

a的值

b的值

!a的值

a && b的值

a  b的值

非0

非0

0

非0

0

0

0

非0

1

0

0

1

说    明

非0变0, 0变1

a,b均非0值才为1

a,b均0值才为0

C语言中,在求解逻辑表达式、关系表达式的值时,数字1代表“真”,数字0代表假。但在判定一个表达式是否为“真”时,以0代表假,以非0代表“真”。例如语句:

a= -3.5 && 5>3;

此语句执行后,变量a的值是1。

数学上的关系式0≤x≤100,在C语言中不能用关系表达式0<=x<=100来表示,表达式0<=x<=100相当于(0<=x)<=100,无论x取何值,表达式0<=x<=100的值总是1,要正确表示数学上的关系式0≤x≤100,只能用逻辑表达式0<=x && x<=100表示。

使用逻辑表达式时,应注意逻辑表达式的“不完全计算”。例如:

a=0;

b=1;

c=a++ && b++;

d=a++  b++;

对于上述第三条语句,“由左到右”扫描表达式,根据优先级的规定,先计算表达式a++的值为0,变量a值被加1变成1,这时系统可以确定逻辑表达式0 && b++ 的值必定是0,因此不再对表达式b++求值,变量b的值不变仍为1。第三句执行后变量a,b的值均为1。

对于上述第四条语句,“由左到右”扫描表达式,根据优先级的规定,先计算表达式a++的值为1,变量a的值被加1变成2,这时系统可以确定逻辑表达式1  b++ 的值必定是1,因此不再对表达式b++求值,因此变量b的值不变仍为1。

因此执行上述程序段后,变量a的值为2, 变量b的值仍为1, 变量c的值为0, 变量d的值为1。

    3.条件运算

C语言中把“ ?  :”称为条件运算符,条件运算符要求有三个运算对象,是C语言中唯一的一个三目运算符。由条件运算符构成的条件表达式的一般形式为:

判定式 ? 表达式1 : 表达式2

运算时先求出“判定式”的值,若“判定式”的值是非零,条件表达式的值取“表达式1”的值,若“判定式”的值为零,条件表达式的值取“表达式2”的值。例如以下语句执行后,变量min取a,b中的小者,

min = a<b ? a : b

条件运算符的优先级高于赋值运算符,但低于关系运算符和逻辑运算符。条件运算符的结合方向为“从右到左”。例如:

a=1;b=2;

c = a<b ? 3 : b>4 ? 5 : 6;

上述条件表达式等价于a<b ? 3 : (b>4 ? 5 : 6),因此变量c的值为3。注意这里不能等价于(a<b ? 3 : b>4) ? 5 : 6,因为这个条件表达式的值为5,与原意不符。

若条件表达式的<表达式1>与<表达式2>类型不同,此时条件表达式的值的类型为二者中级别较高者的类型(有关数据类型级别的高低见图2.6)。例如:

float f, f1;

f = (1 ? 1 : 5)/2;

f1 = (1 ? 1 : 5.0)/2;

上述程序段运行后,变量f的值为0.0, 而变量f1的值为0.5, 这是因为条件表达式(1 ? 1 : 5)的值为1,1/2为整数除,值为0,赋值给变量f值为0.0; 而(1 ? 1 : 5.0)的值为1.0(取双精度实数类型),1.0/2为实数除,值为0.5。

 

 

Tags:

发表评论