之前我们已经认识了和数学同频用于计算的操作符,而今天我们再来介绍几个和数相关的操作符。
-
关系操作符
C语言的关系操作符和数学中的有些类似,但是也有些需要区分开。C语言中的关系操作符主要有下面6个。
- >大于运算符
- <小于运算符
- >=大于等于运算符
- <=小于等于运算符
- ==相等运算符
- !=不相等运算符
关系操作符用于表达式时,该表达式又称关系表达式。
例如:
a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;
我们之前谈论过真或假的概念,非零为真,零为假。而关系表达式中通常返回0或1,表示真假。
例如:20>12返回1,12>20返回0
关系表达式也常用于if或while结构。
if(x == 3)
{
printf("x is 3.\n");
}
划重点了!!!
相等运算符==与赋值运算符=是两个不一样的运算符,一定不要混淆,有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。
if (x = 3)……
上面示例中,如果按照数学的思路来说,它是x为3,在这个位置似乎没什么问题,但是在C语言中,这里会导致这个程序出现问题,x为3,无论如何都是为真,所以下面都会执行。它执行完之后,我们也很难发现它的问题。
在某些结构体的位置上,需要的是判断,也就是判断真假,是否可以往下执行。
为了防止出现这种明明是错误,却可以继续执行的问题,我们可以将变量写在等号的右边。
if(3 == x)……
这样的话,如果把==误写成=,编译器也会报错,我们也可以及时找到问题修改。
另一个需要避免的错误:多个关系运算符不宜连用。
i < j < k
同样的,在数学中,或许没什么问题,但是这个表达式是C语言中的关系表达式,先比较前面i<j会返回1或者0,然后1或者0去和k比较,便会导致它同样出现本该是问题,编译器却没有发现的问题。
所以我们应该换成下面的这种写法:
i < j && j < k
例如:我们输入一个年龄,如果年龄在18岁~36岁之间,我们输出青年。
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(18 <= age <= 36)
{
printf("青年\n");
}
return 0;
}
当我们输入10时,18<=10不成立为假,返回0;然后0<=36成立为真,返回1,也就是打印青年,逻辑上是有问题的,那么这个代码该怎么写呢?
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age >= 18 && age <= 36)
{
printf("青年\n");
}
return 0;
}
或许大家不理解&&的意思,不要着急,我下面会为大家介绍逻辑操作符。
-
逻辑操作符
逻辑操作符提供逻辑判断功能,用于构建更复杂的表达式,大家不要看到复杂就头疼,或许在我介绍完之后,没有那么复杂呢?
而逻辑操作符主要有下面三个运算符:
- !:逻辑取反运算符(改变单个表达式的真假)
例如:
#include <stdio.h>
int main()
{
int flag = 0;
if(!flag)
{
printf("do something\n");
}
return 0;
}
如上面的代码,!flag两侧只有一个变量,所以是单目运算符,如果flag为真,则!flag为假,跳过下面的代码;如果flag为假,则!flag为真,执行下面的代码。
- &&:与运算符,就是并且的意思(两侧的表达式同时都为真,则为真,否则为假)
例如:
#include <stdio.h>
int main()
{
int month = 0;
scanf("%d",&month);
if(month >= 3 && month <= 5)
{
printf("春季\n");
}
return 0;
}
上面的代码中,&&两边均有操作符,即为双目运算符,而这里要表达的意思是两边都成立,即month既要大于3又要小于5,否则为假,不执行下面的代码。
- ||:或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)
例如:
#include <stdio.h>
int main()
{
int month = 0;
scanf("%d",&month);
if(month == 12 || month == 1 || month == 2)
{
printf("冬季\n");
}
return 0;
}
同样的道理,上面的或运算符||两边均有表达式,所以是双目运算符,而两边只要有一个表达式为真,则整个表达式为真,若是均为假,则整个表达式为假。
-
短路
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右侧的表达式求值,这个顺序是保证的。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为“短路”。
如前面的代码:
if(month >= 3 && month <= 5)
如果month>=3不成立,则后面的哪怕成立了,整个式子也为假,因为与运算符&&需要两边的表达式均为真,只要有一个为假,则整体为假。所以对于&&运算符来说,只要左边的表达式为假,不成立,则整个表达式也为假。
那么对于或运算符||来说是怎么样呢?
if(month == 12 || month == 1 || month == 2)
如果month==12成立,则后面的哪怕不成立了,整个式子也为真,因为或运算符||需要其中一边的表达式为真,则整体为真,所以对于或运算符||来说,只要左边的表达式为真,成立了,则整个表达式也为真。
-
条件运算符
最后我们再说一个十分特殊的运算符:条件运算符也叫三目运算符,它是C语言中唯一一个需要使用三个操作数的运算符。形式如下:
exp1?exp2:exp3
条件运算符的计算逻辑是:如果exp1成立,则执行exp2;如果不成立,则执行exp3,最后的计算结果均是整个表达式的值。
例如:使用条件运算符实现找两个数中较大值。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
int m = a > b?a:b;
printf("%d\n",m);
return 0;
}
我们今天的内容就到这里了,如果有什么疑问,可以在评论区留言或者私信噢。