关系运算符和逻辑运算符
内容介绍:
一、关系运算符
二、关系表达式
三、逻辑运算符
四、逻辑表达式
五、短路求值
一、关系运算符
程序所做的事情就是至上而下的执行每一条语句。在现实生活中,程序要进行判断和选择,比如判断用户的年龄是否满18周岁,判断用户是否为年轻貌美的女性等等,这一切需要让程序判断和选择的设计称为分支结构程序设计。
学习之前首先要学习关系运算符和逻辑运算符,在C语言中,使用关系运算符来比较两个数的大小关系,C语言这里总共提供了六个关系运算符,他前四个优先级是相同的,后两个的优先级也是相同的,不过要比前四个的优先级低。
1.使用关系运算符来比较两个数的大小关系:
优先级相同(高):
<(小于)
<=(小于或等于)
>(大于)
>=(大于或等于)
优先级相同(低):
==(等于) //注意,判断两个数是否相等用两个连续的== 中间没有空格,一个 = 表示赋值运算符
!=(不等于)
可以看出,关系运算符比加减乘除要小,比赋值运算符的优先级高。
关系运算符也称双目运算符,对比左右两个操作数的大小关系。
关系运算符得到的值是一个逻辑值(真、假),C语言用1表示真,0表示假。
二、关系表达式
用关系运算符将两边的变量、数据或表达式连接起来,称之为关系表达式。
例子:
1、1<2 //结果为真,C 语言中用1 表示。
2、a> b //具体需要看 a、b 变量存放的值,若 a 为5,b 为3,那么也是真的,也是1。如果 a b 的值反过来,则为假,用 0 表示。
3、a<=1 +b//具体要看a、b变量的值是多少。
4、'a'+'b'<= 'c' //字符在编译系统里面解释为十进制的steam,那么,'a'为97,'b'为98,'c'为99,97+98远远要大于99,所以他是不成立的,所以他的返回值是0。
5、(a= 3)>(b = 5)//有小括号,先对小括号进行运算,先把3赋值给a,再把5赋值给b,再比较a和b两个变量的值,因为3>5,所以表达式是不正确的,于是他的返回值是0。
6、关系表达式只会返回一个逻辑值,只有两个表示形式:1或者0
举例:
1.一关系表达式1<2的值为真,因此该关系表达式的值为1
2.一关系表达式'a' +'b'<= 'c',因为字符'a'、 'b'. 'c'对应的ASCII码分别是97、98、99,即97 +98<= 99,因此该表达式的值为0
检测是不是如此:
#include <stdio .h>
int main ()
{
int a = 5,b = 3 //声明两个变量
printf ( "%d \n", 1< 2);
printf("%d \n", a > b);
printf( "%d \n",a<=b+1);
printf( "%d \n", 'a'+'b'<'c" ) ;
printf0"%d\n", ( a=3) >( b=5);
return 0;
}
代码执行结果如下图:
[fishcqlocalhost s1e10]$ vi test1.c
[fishc@localhost sle10js gcc testi.c && ./a.out
1
1
0
0
0
可以看到返回的值,1<2是正确的,所以是真,用1表示,下面也是同样的道理。
三、逻辑运算符
在C 语言中同时对两个或两个以上的关系表达式进行判断那么就需要用到逻辑运算符,比如一个程序限定只有年满18周岁的少女才能使用,用户使用这个程序就必须满足两个条件:
1、年满18周岁
2、少女
运算符 |
含义 |
优先级 |
举例 |
说明 |
! |
逻辑非 |
高 |
!a |
如果a为真,!a为假; 如果a为假,!a为真。 |
&& |
逻辑与 |
中 |
a && b |
只有a和b同时为真,结果才为真; 只要a和b其中一个为假,结果为假。 |
| | |
逻辑或 |
低 |
a || b |
只要a或b其中一个为真,结果为真; 只有a和b同时为假,结果才为假。 |
C语言总共提供了三种逻辑运算符:
文档查看介绍如下:
逻辑非运算符是单目运算符优先级比双目运算级高。
逻辑与和逻辑或,它们的优先级都是小于关系运算符,大于赋值表达式,同时小于加减乘除。
四、逻辑表达式
用逻辑运算符将两边的变童、数据或表达式连接起来,称之为逻辑表达式。
例子:
1、3 >1&& 1<2 //关系运算符优先级要比逻辑与高,所以要先计算3>1,而3>1的条件符合,所以返回的值为1,1<2的条件符合,所以返回的值为1,所以整个逻辑表达式的值都是真的。
2、3+1 || 2 ==0 //关系表达式和逻辑表达式反馈的值只有两个1或0,开发者让编译系统判断的规则相对宽松一点,用0表示假,用任何非0的表示真。所以3+1为4非0。
3、!(a +b) //关系表达式和逻辑表达式反馈给的值和获得的值有两个,1或者0,是编译系统给的。用0来表示假,用任何非0的数(ASCII码)来表示真来反馈给编译系统。
4、!0+1<1 || !(3 +4) //
5、'a' - 'b’&& 'c'
上机代码操作:
int main ( )
{
int a = 5,b=3;
printf("%d\n" , 3>1&&1 < 2) ;
printf("%d\n"" , 3+1 || 2-= 0) ;
printf(""%d n" , ! (a + b) ) ;.
printf(""%d n", !0+1<1ll!(3+4));
printf( ""%d \n", ' a' -'b' &&‘c’) ;
return 0;
}
执行代码结果为:
[fishc@localhost s1e10]$ vi test2.c
ifishc@localhost s1e10]$ gcc test2.c && ./a.out
1
1
0
0
1
第三个a b 变量的值初始化为5和3,相加等于8是真的,逻辑非后的值就是0。
第四个0为假,逻辑非运算之后为真1+1>1,所以左边整个逻辑表达式为0,3+4为真,逻辑非为假,所以整个得到的是0。
第五个' a' 、'b' 、‘c’ 的值分别为97、98、99,97-98为-1,不是0所以是真的,所以整个得到的是1。
五、短路求值
1.短路求值又称最小化求值,是一种逻辑运算符的求值策略。只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值。
2.C语言对于逻辑与和逻辑或采用短路求值的方式。
实例讲解:
#include <stdio.h>
int main( )
{
int a = 3, b =3;
( a =0)&&(b = 5);
printf ( "a= %d, b = %d\n", a,b);
( a = 1) || (b = 5)“
printf( "a'=%d , b= %d \n", a, b);
return 0;
}
将a b 的变量赋值后打印出来,打印的结果第一个应该是a 等于0,b等于5,第二个a等于1,b等于5
执行代码结果如下:
[fishc@localhost sle10]$ vi test3.c
[ fishc@localhost sle10]s gcc test3.c && ./a.out
a = 0, b = 3
a=1,b=3
可以看到b没有改变,a 变成了0和1,这就是短路求值的原则。
第一个是逻辑与,要求左边和右边同时成立,结果才会为真,但只要左边不成立,右边就不会再进行运算,所以5并不会赋值给b。
第二个逻辑或是左边或右边任何一边成立就可以,左边先运行a赋值为1,为真成立,后边就不再运行了。
C语言对逻辑与,逻辑或是采用短路求值方式的。