目录
一:逻辑操作符
C 语言用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称
为“关系运算符”(relational operator),主要有下面6个。
• > 大于运算符
• < ⼩于运算符
• >= ⼤于等于运算符
• <= ⼩于等于运算符
• == 相等运算符
• != 不相等运算符
下面是一些例子
a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;
关系表达式通常返回 0 或 1 ,表示真假。
C 语言中, 0 表示假,所有非零值表示真。比如, 20 > 12 返回 1 , 12 > 20 返回 0 。
关系表达式常用于 if 或 while 结构。
if (x == 3) {
printf("x is 3.\n");
}
注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不小心写出下⾯的代码,它可以运行,但很容易出现意料之外的结果。
上面示例中,原意是 x == 3 ,但是不小心写成 x = 3 。这个式子表示对变量 x 赋值 3 ,它的返
回值为 3 ,所以 if 判断总是为真。
为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。
这样的话把==打成=编译器就会出错。
另⼀个需要避免的错误是:多个关系运算符不宜连用。
i < j < k
//假设i==10,j==6,k==14
//依然会输出结果
//原因是:先算i<j,不成立为假,假的结果是0,而0恒小于k,所以这个条件恒成立
上面示例中,连续使用两个小于运算符。这是合法表达式不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执行的是下⾯的表达式。
上面式子中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进行比较。如果想要判断变量 j
的值是否在 i 和 k 之间,应该使用下面的写法。
(i < j) < k
上面式⼦中,
i < j
返回
0
或
1
,所以最终是
0
或
1
与变量
k
进行比较。如果想要判断变量
j
的值是否在
i
和
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和age中存放的10比较,表达式18<=10为假, 18<=age 的结果是0,再拿0和 36比较,0<=36为真,所以打印了青年 ,所以即使当age是10的时候,也能打印青年 ,逻辑上是有 问题,这个代码应该怎么写呢?
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age>=18 && age<=36)
{
printf("⻘年\n");
}
return 0;
}
以上就是关于操作符,我们需要掌握的,剩下的只要按照字面意思理解使用就行,没有特别注意的。
二:条件操作符
条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果
exp1
为真,
exp2
计算,计算的结果是整个表达式的结果;如果
exp1
为假,
exp3
计算,计算的结果是整个表达式的结果。
练习1:使用条件操作符表示下面代码的逻辑
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
if (a > 5)
b = 3;
else
b = -3;
printf("%d\n", b);
return 0;
}
改造后:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
b = a>5 ? 3:-3;
printf("%d\n", b);
return 0;
}
练习2:使用条件表达式实现找两个数中较大值
#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;
}
三:逻辑操作符:&&,||,!
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
•
!
:逻辑取反运算符(改变单个表达式的真假)
•
&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
•
||
:或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
注:C语⾔中,⾮0表示真,0表示假
3.1逻辑取反运算符
比如,我们有一个变量叫
flag
,如果flag为假,要做⼀个什么事情,就可以这样写代码:
#include <stdio.h>
int main()
{
int flag = 0;
if(!flag)
{
printf("do something\n");
}
return 0;
}
如果
flag
为真,
!flag
就是假,如果
flag
为假,
!flag
就是真 所以上⾯的代码的意思就是 flag
为假,执行if语句中的代码。
3.2与运算符
&&
就是与运算符,也是并且的意思,
&&
是一个双目操作符,使用的方式是
a&&b
,
&&
两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。
比如:如果我们说月份是3月到5月,是春天,那使用代码怎么体现呢?
#include<stdio.h>
{
int month = 0;
scanf("%d", &month);
if(month >= 3 && month <= 5)
{
printf("春季\n");
}
return 0;
}
这里表达的意思就是month既要大于等于3,⼜要小于等于5,必须同时满足。
3.3或运算符
||
就是或运算符,也就是或者的意思,
||
也是⼀个双目操作符,使用的方式是
a || b
,
||
两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
比如:我们说⼀年中月份是12月或者1月或者2月是冬天,那么我们怎么使用代码体现呢?
int month = 0;
scanf("%d", &month);
if(month == 12 || month==1 || month == 2)
{
printf("冬季\n");
}
四:练习——闰年的判断
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
1.
能被4整除并且不能被100整除是闰年
2.
能被400整除是闰年(百年不闰)
#include <stdio.h>
//代码1
int main()
{
int year = 0;
scanf("%d", &year);
if(year%4==0 && year%100!=0)
printf("是闰年\n");
else if(year%400==0)
printf("是闰年\n");
return 0;
}
//代码2
int main()
{
int year = 0;
scanf("%d", &year);
if((year%4==0 && year%100!=0) || (year%400==0))
printf("是闰年\n");
return 0;
}
五:短路
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时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值。
练习:阅读代码,计算代码输出的结果
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
逻辑是:a++是后置的,所以是先使用a的值,再使的值加一,a的初始值是0,在C语言中表示假,在与逻辑中,一个假结果就是假,所以后面的值就不再计算。
如果把&&改成||呢?
逻辑是:a++是后置的,所以是先使用a的值,再使的值加一,a的初始值是0,在C语言中表示假,在或逻辑中,都是假结果就是假,但之后所有的字母均大于0,所以后面的值就均计算。
好啦!关于操作符的讲解就到这里结束了,如果还有不懂的知识点或者是本篇文章有不对的地方,欢迎在评论区里评论出来。友友们,下一篇讲解C语言另一个选择语句——switch语句!