C语言关系运算符详解(附带优先级和结合性一览表)
在上节《C语言if else语句的用法》中看到,if 的判断条件中使用了
C语言关系运算符用来比较两个值之间大小,例如是否相等、大于或小于等。
关系运算符在使用时,它的的两边都会有一个表达式,比如变量、数值、加减乘除运算等,关系运算符的作用就是判明这两个表达式的大小关系。注意,是判明大小关系,不是其他关系。
C语言提供了以下 6 种关系运算符:
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>= 的优先级相同,但是高于 == 和 !=,== 和 != 的优先级相同。
1) a+b > c-d
2) x > 3/2
3) 'a'+1 < c
4) -i-5*j == k+1
关系运算符也可以嵌套使用,例如:
1) a > (b > c)
2) a != (c == d)
关系运算符的运算结果只有 0(假)或 1(真)。当条件成立时结果为 1,条件不成立结果为 0。例如:
在C语言中,我们将零值称为“假”,表示条件不成立;相反,我们将非零值称为“真”,表示条件成立。关系运算符的结果要么是真,要么是假。
下面的代码会将关系运算符的结果输出:
1, 0
1, 1
0, 0
对于含多个关系运算符的表达式,如 k==j==i+5,根据运算符的左结合性,先计算 k==j,该式不成立,其值为 0,再计算 0==i+5,也不成立,故表达式值为 0。
关于条件运算符的更多例子,我们已经在《C语言if else语句的用法》中提到,感兴趣的读者请猛击链接查看。
需要提醒的是,
在情况①中,变量 a 的值是整个表达式的结果,如果 a 的值为非零,那么条件成立,否则就不成立。
在情况②中,判断条件是一个赋值语句,变量 b 的值是整个表达式的结果。我们把整数 5 赋值给变量 b,那么 b 的值就是 5,整个表达式的值也是 5,它是一个非零值,所以条件成立。
在情况③中,issupper() 函数用来判断字符是否是大写,它的返回值是整个表达式的结果。字符
>=
、<=
、<
等符号,它们专门用在判断条件中,让程序决定下一步的操作,称为关系运算符(Relational Operators)。C语言关系运算符用来比较两个值之间大小,例如是否相等、大于或小于等。
关系运算符在使用时,它的的两边都会有一个表达式,比如变量、数值、加减乘除运算等,关系运算符的作用就是判明这两个表达式的大小关系。注意,是判明大小关系,不是其他关系。
C语言提供了以下 6 种关系运算符:
关系运算符 | 含 义 | 数学中的表示 | 优先级 | 结合性 |
---|---|---|---|---|
< | 小于 | < | 高 | 从左到右 |
<= | 小于或等于 | ≤ | ||
> | 大于 | > | ||
>= | 大于或等于 | ≥ | ||
== | 等于 | = | 低 | |
!= | 不等于 | ≠ |
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>= 的优先级相同,但是高于 == 和 !=,== 和 != 的优先级相同。
在C语言中,有的运算符有两个操作数,例如 10+20,10 和 20 都是操作数,+ 是运算符。我们将这样的运算符称为双目运算符。同理,将有一个操作数的运算符称为单目运算符,将有三个操作数的运算符称为三目运算符。
常见的双目运算符有 +、-、*、/ 等,单目运算符有 ++、-- 等,三目运算符只有一个,就是? :
,我们将在《C语言条件运算符》中详细介绍。
1) a+b > c-d
2) x > 3/2
3) 'a'+1 < c
4) -i-5*j == k+1
关系运算符也可以嵌套使用,例如:
1) a > (b > c)
2) a != (c == d)
关系运算符的运算结果只有 0(假)或 1(真)。当条件成立时结果为 1,条件不成立结果为 0。例如:
- 5>0 成立,其值为 1;
- 34-12>100 不成立,其值为 0;
- (a=3)>(b=5) 由于3>5不成立,故其值为 0。
在C语言中,我们将零值称为“假”,表示条件不成立;相反,我们将非零值称为“真”,表示条件成立。关系运算符的结果要么是真,要么是假。
下面的代码会将关系运算符的结果输出:
#include <stdio.h> int main(){ char c='k'; int i=1, j=2, k=3; float x=3e+5, y=0.85; int result_1 = 'a'+5<c, result_2 = x-5.25<=x+y; printf( "%d, %d\n", result_1, -i-2*j>=k+1 ); printf( "%d, %d\n", 1<j<5, result_2 ); printf( "%d, %d\n", i+j+k==-2*j, k==j==i+5 ); return 0; }运行结果:
1, 0
1, 1
0, 0
对于含多个关系运算符的表达式,如 k==j==i+5,根据运算符的左结合性,先计算 k==j,该式不成立,其值为 0,再计算 0==i+5,也不成立,故表达式值为 0。
关于条件运算符的更多例子,我们已经在《C语言if else语句的用法》中提到,感兴趣的读者请猛击链接查看。
需要提醒的是,
==
才表示等于,而=
表示赋值,它们是两个不同的运算符,大家要注意区分,切勿混淆。再谈 if 语句的判断条件
if 语句的判断条件可以是任何有效的C语言表达式,它的写法是非常灵活的,不一定非要包含条件运算符。判断条件可以是一个赋值语句,或者一个变量,或者一个函数调用,例如://情况①:判断条件是一个变量 if(a){ //TODO: } //情况②:判断条件是一个赋值语句 if(b=5){ //TODO: } //情况③:判断条件是一个函数调用 char c = 'B'; if(isupper(c)){ //TODO: }以上写法都是允许的。只要整个表达式的值为非零,条件就成立;否则,条件就不成立。
在情况①中,变量 a 的值是整个表达式的结果,如果 a 的值为非零,那么条件成立,否则就不成立。
在情况②中,判断条件是一个赋值语句,变量 b 的值是整个表达式的结果。我们把整数 5 赋值给变量 b,那么 b 的值就是 5,整个表达式的值也是 5,它是一个非零值,所以条件成立。
在情况③中,issupper() 函数用来判断字符是否是大写,它的返回值是整个表达式的结果。字符
'B'
是大写,issupper() 返回非零值,条件成立。