引言:接上篇文章,继续介绍操作符(运算符)。
1. 框架
2. 关系操作符
2.1 概念:
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称
为“关系运算符”(relational operator)。
2.2 关系操作符有哪些?
•
>
⼤于运算符
•
<
⼩于运算符
•
>=
⼤于等于运算符
•
<=
⼩于等于运算符
•
==
相等运算符
•
!=
不相等运算符
这些操作符都比较容易理解,但需要注意一下
相等运算符
,其与
赋值操作符=
是两个不一样的操作符,不要混淆。
2.3 使用规范
多个关系操作符不宜连⽤。
x<y<z
上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 y
的值在 x
和 z
之间。因为
关系运算符是从左到右计算
,所以实际执⾏的是下⾯的表达式。
(x<y)<z
上⾯式⼦中, x
< y
返回
0
或
1
,所以最终是
0
或
1
与变量 z
进⾏⽐较。如果想要判断变量 y
的值是否在 x
和 z
之间,应该使⽤下⾯的写法。
x<y&&y<z//&&是并且的意思,是一种逻辑操作符。
下面我们介绍逻辑操作符:
3. 逻辑操作符
3.1 逻辑操作符是用来干什么的?
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式。
3.2 逻辑操作符有哪些?
主要有下⾯三个运算符:
•
!
:逻辑取反运算符(改变单个表达式的真假)。
•
&&
:与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
•
||
:或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
注:C语⾔中,⾮0表⽰真,0表⽰假
下面逐个展开介绍:
3.3 逻辑取反运算符 !
#include<stdio.h>
int main()
{
int flag = 0;//定义flag为0,即为假。
if (!flag)//对其取反,变为1,即为真。
//if是如果的意思,是一种选择结构语句,后面会介绍到。当()的表达式为真时,执行下面的语句。
{
printf("%s","ture");//语句
}
return 0;
}
上面的代码运行结果为:
#include<stdio.h>
int main()
{
int ture = 1;//定义ture为1,即为真。
if (!ture)//对其取反,变为0,即为假。
{
printf("%s", "flag");//上述表达式为假,该语句不执行。
}
else//else是其他的意思,if语句不执行,就执行else下的语句。
{
printf("上述表达式为假");//执行
}
return 0;
}
上面的代码运行结果为:
另外联系一下上篇文章,逻辑取反运算符 !也是一种单目操作符。
3.4 与运算符&&
&&,上文提到过,是并且的意思,与上篇文章的算术操作符一样,是一个双目操作符,使⽤的⽅式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假,即全真则真,一假则假。
#include<stdio.h>
int main()
{
int x = 3;//定义x,并初始化为3。
int y = 4;//定义y,并初始化为4。
int z = 5;//定义z,并初始化为5。
if (x < y && y < z)//3<4<5,表达式为真,执行下面语句。
{
printf("y大于x,且y小于z");
}
return 0;
}
上面的代码运行结果为:
结合现实:
如果我们说⽉份是3⽉到5⽉,是春天,那使⽤代码怎么体现呢?
#include<stdio.h>
int main()
{
int month = 0;//定义month表示月份。
while (scanf("%d", &month) == 1)//while(scanf("%d", &month)!=EOF)
/*while实现多组输入,因只有month一个变量,故表示为==1,有几个变量,==后就跟数字几,如果感到麻烦,也可写为都写为!=EOF。*/
{
//这里再次应用if else语句,后续会具体讲解。
if (month >= 3 && month <= 5)
//这⾥表达的意思就是month既要⼤于等于3,⼜要⼩于等于5,必须同时满⾜。
{
printf("春季\n");
}
else
{
printf("该月不属于春季\n");
}
}
return 0;
}
上面的代码运行结果为:
在vs编译器上使用三个Ctrl+z结束运行。
3.5 或运算符 ||
||
就是或运算符,也就是或者的意思,
||
也是⼀个
双⽬操作符
,使⽤的⽅式是
a || b
,
|| 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假,即
一真则真,全假则假。
下面用代码实践:
如果我们说⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天,那么我们怎么使⽤代码体现呢?
#include<stdio.h>
int main()
{
int month = 0;
while (scanf("%d", &month) == 1)
{
if (month == 12 || month == 1 || month == 2)
//month为12或者为1再或者为2,都执行下面语句。
{
printf("冬季\n");
}
else//不为这三个月,都执行下面语句。
{
printf("该月不属于冬季\n");
}
}
return 0;
}
上面的代码运行结果为:
3.6 特点“短路”
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“
短路
”。
对于&&运算符如前⾯的代码:
if(month >= 3 && month <= 5)
表达式中&& 的左操作数是
month >= 3
,右操作数是
month <= 5
,
当左操作数 month >= 3 的
结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,
左边操作数的结果
是0
的时候,右边操作数就不再执⾏。
对于
|| 操作符如前⾯的代码:
if(month == 12 || month==1 || month == 2)
如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。
所以,
||
操作符的
左操作数的结果不为0时,就⽆需执⾏右操作数。
4. 结言
本篇文章进一步介绍了操作符,并引入了if else语句,这是分支与循环的相关知识,后续会进行介绍,下篇文章牛刀小试一下,综合运用&&与||。