关系操作符
C语言 用于比较的表达式称为“关系表达式”,使用的运算符就称为“关系运算符”
常用的关系运算符:
- >:大于运算符
- <:小于运算符
- >=:大于等于运算符
- <=:小于等于运算符
- ==:相等运算符
- !=:不相等运算符
关系表达式通常返回0或1,用于表示真假。
举例:
- 20>12,返回1;
- 12>20,返回0;
关系表达式通常用于if或while结构。
举例:
if(x == 6)//判断x是否于6相等
{
printf("x is 6");
}
注意:x==3不等价于x=3,前者用于判断是否等价,后者用于赋值
使用关系运算符时,不宜将多个运算符连用,如(a<b<c)。虽合法,但并不能保证b的值介于(a,b)之间。原因是关系运算符是从左至右运算的,所以(a<b<c)等价于((a<b)<c)。由于(a<b)返回的结果为0或1,所以c是与0或1进行比较。
综上所述:如果要正确表达(a<b<c),正确的写法是(a<b && b<c)。
条件操作符
条件操作符也称为三目操作符,需要接收三个操作数,具体格式为:
exp1 ? exp2 : exp3
//如果exp1为真,则执行exp2,否则执行exp3
举例:使用条件表达式找出两个数中较大值
#include<stdio.h>
//使用条件表达式找出两个数中的较大者
int main()
{
int a;
int b;
int max;
while (scanf("%d %d",&a,&b)!=EOF)
{
max = a > b ? a : b;
//判断a与b的大小,并将较大的数赋值给max
printf("max=%d\n", max);
}
return 0;
}
逻辑操作符
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式。
主要有一下三个操作符:
- !:逻辑取反运算符(改变单个表达式的真假);
A !A 0 1 非0 0 - &&:与运算符,表示“并且”,只有当两侧表达式同为真时,才为真(一假全假);
A B A && B 0 0 0 0 非0 0 非0 0 0 非0 非0 1 - ||:或运算符,表示“或者”,当两侧表达式其中之一为真是,则为真(一真全真);
A B A || B 0 0 0 0 非0 1 非0 0 1 非0 非0 1
举例:判断是否为闰年
#include<stdio.h>
//判断是否为闰年
int main()
{
int year;
while (scanf("%d", &year))
{
if ((year%4==0 && year%100!=0) ||(year%400 == 0))
//判断闰年的条件是:年份能够被4整除但不能被100整除,或年份能被400整除
{
printf("%d年是闰年\n", year);
}
else
{
printf("%d年不是闰年\n", year);
}
}
return 0;
}
短路
C语言的逻辑运算符有个特点,它总是先对左侧的表达式求值,再对右边的表达式求值。
如果左边的表达式满足逻辑运算符的条件,则不再对右边的表达式求值,这种情况称为“短路”。
举例:
if(a>=6 && a<=8)
解释:
如果左操作数(a>=6)的结果为0,则无需再判断(a<=8)。所以,对于&&操作符来说,左边操作符结果为0时,右边则不再执行。
举例:
#include<stdio.h>
//短路练习
int main()
{
int i;
int a = 0;
int b = 1;
int c = 2;
int d = 3;
i = a++ && b++ && c++ && d++;
printf("%d,%d,%d,%d,%d",i, a, b, c, d);
return 0;
}
运行结果如下:
解释:
a的初值为0,在进行&&判断时,由于a为0,则后面无需进行计算,b、c、d的值为初始值不变,此时i的值为0。
将a的值赋值给i后,再执行a++,此时a的值为1。