目录
前言:
1.什么是操作符
2.算术操作符
3.移位操作符
4.位操作符
5.逻辑操作符
5.1逻辑与
5.2逻辑或
5.3练习
5.4逻辑非
前言:
博主这几天都在积累知识,俗话说:”只有多输入才能有输出”。在写博客之前,也是要沉淀的嘛(当然有不排除博主有点累想休息会,呜呜),为了不辜负志同道合的同志们的期望,我又来啦!
1.什么是操作符
在讲各种操作符之前,可以先了解一下什么是操作符,操作符是干什么的等一系列问题。
其实操作符就是对数据进行相应的运算操作,是C语言固定下来的一套语法。比如这里的+、*是算术操作符,sizeof()是单目操作符等还有一系列操作符,我们接着往下看吧!
2.算术操作符
算术操作符有:+、-、*、/、%。
相信大家对加法、减法、乘法、除法都不陌生,而对%(取模)操作符感到不知所措,乍一看,脱口而出可能就是百分号,实际不是,请听我娓娓道来~
/(除号) | 得到被除数与除数的商 |
%(取模) | 得到被除数与除数的余 |
在进行除法运算的时候,有分以下两种情况:
- 整数除法
由于整数除法得到的是表达式的商,所以a/b得到的结果是3。
- 小数除法
上面的整数除法并没说得到的结果是3.33333...,而是只得到3,这是因为/两边的操作数(操作符操作的数据)都是整型,所以它只保留除后的商的整数部分。小数除法就不一样了,得到的商在数值上就是数学意义上的值,并且没有说只保留商2.500000的整数部分2。
总结:除法中,除数不能是0,计算机没有对这种做法进行定义;/得到的是商;/的左右操作数中,只要有一个是小数(浮点数),除法进行的就是小数除法,在数值上与数学一致。
取模%操作符:
取模操作得到的是余数,10除以3商3余1,由于进行的取模运算,得到的结果是1。
总结:取模运算可以这样理解,仍旧是对两个操作数进行除法运算,然后取余数;注意一点的是,不能对浮点数进行取模运算;取模运算的除数不能为0(因为取模本质上还是除法,只是结果取值的方向而已)。
3.移位操作符
移位操作符(左移操作符<<、右移操作符>>)用于对整数的二进制位进行移位操作,我们直接看代码:
首先我们看到输出结果:我们用n>>1给m初始化,在后面打印n的时候,n还是4没有变,所以n进行右移操作后,并不会影响n本身(也就是没有把n改成2)。但如果右移的结果赋值给n,那就会改变了,比如 n = n >> 1;。
右移操作丢弃掉右边越界的一位,补上左边空缺的一位,补位分两种:
- 算术右移的补位:算术右移在左边补上的是有符号数的符号位。
- 逻辑右移的补位:逻辑右移在左边统一补上0。
一般编译器采取的是算术右移的补位机制,请看下面代码:
如果我们这里进行的逻辑右移,那么将会得到一个很大的数字。
补充:算术右移后的那一串二级制还是补码,为什么呢?因为移位操作符是对整数的补码进行移位的。还有在打印的时候,需要把补码逆着求原码。
规律:右移一位得到的结果是数值除以2,左移一位是乘以2。假设现在有个0100(整型,前面的0都省略掉),数值是4。1所在的位置是2的2次方权重,当右移一位变成0010,权重变成了2的1次方,相当于除了个2。
注意:一个整型有32位,那么最多只能移动31位,移动32位或更多是没有定义的行为;不能移动浮点数,只能对整数进行移位;移动的位数不能是负数,脑洞大开的人动了一下脑子写出:a >> -1,诶,右移负一位是不是就相当于左移1位,NO,这种行为没有被定义。
4.位操作符
位操作符有:&(按位与)、|(按位或)、^(按位异或)3个操作符。话不多说,看代码:
3和5的二进制分别简写成0011和1001,前面的28位都是0。
- 按位与&:对应二进制位进行操作,只要有0,该二进制位最终就是0;只有全1,结果才为1;
- 按位或|:对应二进制位进行操作,只要有1,结果就是1;只有全0,结果才为0;
- 按位异或^:这个尖操作符不是数学中表示阶乘的那个符号,在计算机中是异或操作符。"同0异1",二进制位都为0或都为1,得到的结果是0;二进制位是0、1得到的结果是1;
5.逻辑操作符
逻辑操作符有三个:&&(逻辑与)、||(逻辑或)、!(逻辑反)。它们针对的是结果的真和假!常被用在判断的条件中表示"并且"、"或者"、"非"。
5.1逻辑与
逻辑与是并且的意思,只有当两个条件都满足时,结果才为真。字面理解,A并且B都完成它们的任务,这件事才能完成~
为什么这里会打印出青年呢?这是由于在计算机中,想表达数学中一个连续区间,不能这样写,需要用到&&(并且)这个操作符。这里能打印出来的原因是:
关系操作符(<)从左到右的操作步骤,后面也会讲关系操作符。
5.2逻辑或
逻辑或是或者的意思,只要有一个条件达成,那么结果就为真。A或者B完成任务,这个任务就完成了~
a<20成立,||(或者)只要两边有一个条件成立,该判断条件的结果就是真。
5.3练习
1.打印出1000-2000之间为闰年的年份
==关系操作符使用来判断相等的,我们在这里提前看到了!(逻辑反)。是的,它其实就是进行一种相反的操作,!=是判断不等于的关系操作符。
2.判断年龄
5.4逻辑非
!感叹号在计算机中表示的是逻辑非,它可以把真的变成假,假的变成真。在计算机中,非0为真,如果非0值前面加上!,结果就是假,值为0。如果给0加上感叹号,结果变为真,默认的表示真的数值是1。
以上就是三个逻辑表达式的基本内容啦。接下来还有关于逻辑与和逻辑或控制表达式求值的补充知识点~
我们知道逻辑与只要两边有一边出现了假,那结果一定为假,逻辑或只有一边出现了真,那结果一定为真;我们还需要知道的一点是,计算机在执行逻辑与和逻辑或操作符的时候,确保先计算左操作数,再计算右操作数;结合前面的两点,这两个逻辑操作符还有一个特性,那就是如果这个表达式在计算右边的操作数之前已经有确切的答案了,那么右边的表达式不会被执行。
#include <stdio.h>
int main()
{
int a = 0;
int b = 1;
int c = 2;
int d = a++ && ++b && c++;
printf("%d %d %d %d", a, b, c, d);
return 0;
}
这道题的结果是多少,思考一会,好,我们看答案~
因为a++,++是后置加加,a是先使用原先的值参与表达式求值运算,再自己增加1(自增)。由于a原先的值是0,而且是&&逻辑与操作符,左边的操作数为假,右边的++b,c++都没能执行,就结束了,表达式的结果为0,故d里存放的值是0。
若换成逻辑或呢?我们依旧分析,a++使用的是0,结果还不确定。执行++b,++是前置加加,b本来是1,先自增成2,再用来参与表达式求值,由于是||逻辑或,出现了操作数为真,结果肯定为真,表达式的结果为1,故d里的值为1。c++就没有被执行了。最后的结果就是:1 2 2 1。
总结:逻辑与就是并且、逻辑或就是或者、逻辑非就是非,&&和||对表达式求值有控制效果,术语叫做短路求值,&&当出现假时,停止运算;||当出现真时,停止运算。
好啦~,这篇字数挺多了,分成两篇学习操作符吧~。
结语:希望读者读完能有所收获!对C语言操作符有进一步的认识!✔
读者对本文不理解的地方,或是发现文章内容上有误等,请在下方评论留言告诉博主哟~,也可以对博主提出一些文章改进的建议,感激不尽!最后的最后!
❤求点赞,求关注,你的点赞是我更新的动力,一起进步吧。