•>
大于运算符
• <
小于运算符
• >=
大于等于运算符
• <=
小于等于运算符
• ==
相等运算符
• !=
不相等运算符
关系表达式通常返回 0 或 1 ,表示真假,0是假,1是真。
相等运算符 ==
与赋值运算符=
是两个不⼀样的运算符,不要混淆。
错误的写法,会让程序有错误的输出:
if(x = 4)
表达式本意是x==4
但是写成x=4
就是把4赋值给了x
,所以if
判断总是真的。
当然,有些程序员为了防止这样的错误,常常这样写:
if (4 == x)
上面的写法,如果只写一个等号,即if (4 = x)
就会报错。
多个关系运算符不宜连用
下面的写法,虽然可以,不会报错,但是通常不会出现我们想要的结果:
x>y>z
我们可以这样写(x>y)>z
关系运算符是从左到右计算。
来个例子,我们规定10~20岁输出青年:
# include
int main()
{
int a;
scanf("%d",&a);
if(10<=a<=20)
{
printf("青年\n");
}
}
此时,我们输入9,输出的结果依然是青年
,出现这个现象的原因是,10<=a
,a=9
,所以这个是假,即为0,0<=20
是真,所以打印出了青年,即使是9,也可以打印出,这个存在逻辑上是有问题的。
正确写法:
# include
int main()
{
int a;
scanf("%d",&a);
if(10<=a&&a<=20)
{
printf("青年\n");
}
}
此时输出的结果才是正确的,输入9,不会再输出青年
。
需要接受三个操作数的。
例子:
xx1 ? xx2 : xx3
如果xx1为真,xx2计算;如果xx1为假,xx3计算,计算的结果是整个表达式的结果。
例如,可以用条件表达式,找两个数中的最大值
正常写法:
#include
int main()
{
int a = 0, b = 0;
scanf("%d%d", &a, &b);
if (a > b)
printf("%d", a);
else
printf("%d", b);
return 0;
}
用条件表达式:
#include
int main()
{
int a = 0, b = 0;
scanf("%d%d", &a, &b);
int m = a > b ? a : b;
printf("%d", m);
return 0;
}
输入:2 3
输出的结果都是3
。(两个程序)
•!
:逻辑取反运算符(改变单个表达式的真假)。
# include
int main()
{
int arr = 0;
if (!arr)
printf("hello mom\n");
return 0;
}
! arr
为真,所以执行下面的语句,所以输出hello mom
。
• &&
:与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
&&
两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。
例如我们说18~20岁是青年:
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age>=18&&age<=20)
printf("青年\n");
return 0;
}
这里是指必须同时满足age大于等于18,小于等于20岁,才会输出 青年。
• ||
:或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
注:C语言中,非0表示真,0表示假
||
两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
比如,我们说58,59或60岁步入老年
# include
int main()
{
int age;
scanf("%d", &age);
if (age == 58 || age == 59 || age == 60)
printf("步入老年\n");
return 0;
}
C语言有一个特定的顺序:先对左侧的表达式求值,再对右边的表达式求值。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为 “短路”。
例如:
对于 &&
:
age>=18&&age<=20
,左操作符是age>=18
,右操作符是age<=20
,如果做操作符是0,即使不去判断右操作符,结果也是 0。
对于||
:
if (age == 58 || age == 59 || age == 60)
如果输入age=58
就无须判断后面的,整个表达式的结果就是 1(步入老年)
所以, ||
操作符的左操作数的结果不为0时,就⽆需执行右操作数。