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 |
1 |
1 |
非0 |
0 |
0 |
0 |
1 |
0 |
非0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
说 明 |
非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。
发表评论