本文对C语言的操作符进行详细讲解,让你学会使用各种操作符,编程技术更上一层楼!!!
详解C语言操作符
操作符分类—上
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
一.算数操作符
+加 -减 *乘 /除 %取模
1.算数操作符介绍
这五个算数操作符原理与数学上的大致相似,但是有些表现形式与数学不同.
这五个操作符作用是在计算机内部对左右两边两个操作数进行相应的操作(加.减.乘.除.取模)然后返回一个经过运算后的值.
① +加法操作符
② -减法操作符
上面这串代码使a ,b两个变量存储的值相加最后通过printf打印他们相加后返回的值为数字7.
③ *乘法操作符
上面这串代码使a ,b两个变量存储的值相减最后通过printf打印他们相加后返回的值为数字-1.
④ \除法操作符
上面这串代码使a ,b两个变量存储的值相乘最后通过printf打印他们相加后返回的值为数字12.
上面这串代码使a ,b两个变量存储的值相乘最后通过printf打印他们相加后返回的值为数字0.
这里就有疑惑了,为什么3/4 3除以4不应该是0.75吗为什么结果是0,
因为C语言中语法规定,除法操作分整数除法和小数除法,
整数除法:当/两边都是整数时实行整数除法,3/4等于0余数为4,所以结果就是0
小数除法:当/两边至少有一边的操作数是小数就会执行小数除法3.0/4会等于0.75
上面这串代码使3.0(浮点数) ,b一个个变量存储的值相乘最后通过printf打印他们相加后返回的值为一个浮点数,要用%lf打印出结果0.75.
上面这串代码使a ,b两个变量存储的值相除然后取余数最后通过printf打印他们相加后取模后的值,按正常运行来看3.0%4相当于3除以4 商0余数为3 此时结果应该为4 可为什么发生错误了.
因为%取模操作符要求左右两边的操作数必须为整数,当出现负数就会出错
⑤ %取模(余数)操作符
上面这串代码使a ,b两个变量存储的值相除然后取余数最后通过printf打印他们取模后的值 即余数为3.
2.算术运算符总结
- 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
- 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
- % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
二.移位操作符
左移操作符<<
右移操作符>>
注:移位操作符的操作数只能是整数。
1.移位操作符介绍
移位操作符是在计算机内部进行移位操作是对二进制补码进行操作,有左移和右移操作符.
但对应的操作数只能是整数且是这个整数转换为的二进制补码,
对于进制数和原反补的转换在这篇博客中不懂的可以看这篇博客->进制数和原反补
① <<左移操作符
左移操作符的移位规则:左边丢弃,右边补0.
num变量里开始存放的是10,打印num左移一位后的结果为20,它们是怎么转换的呢
首先10在计算机内部存放的二进制补码是00000000000000000000000000001010
将num左移一位就是整个32位二进制序列向左移动一位,然后最左边一位丢弃 最右边再补0,此时为00000000000000000000000000010100
这串数字以有符号整形打印出来为2的四次方加2的二次方为20.
那左移两位会发生什么?
从图中可见左移两位 值变成了40,实际上 左移操作符每左移一位表示这个数字比原先扩大了1倍 10扩大一倍为20,20扩大一倍为40.
②>>右移操作符
移位规则: 首先右移运算分两种:
- 逻辑移位 左边用0填充,右边丢弃
- 算术移位 左边用原该值的符号位填充,右边丢弃 具体用的哪种移位看编译器的设定,大部分是算数右移.
num开始里面是-1 而右移一位之后的结果还是-1,这结果是怎么得到的?
首先右移是在计算机内部运行是对num里的数转换成的二进制补码进行右移,此时-1原码为10000000000000000000000000000001转换成补码为11111111111111111111111111111111
此时右边丢弃左边补0或1,当补0时,最高位是0表示正数,此时原反补相同得到的结果应该是一个很大的数,但是这里结果是-1,而当右边是补1的时候,得到的二进制序列还是32个1,此时最高位是负数,转化成原码为-1,和结果一样,说明vs编译器用的是右边丢弃左边补符号位的移位规则,
当移位的数字是一个有倍数关系时,右移操作每移动一位相当于原来的数缩小二分之一.
上面这段表达是错误的,num向右移-1 本身想表达的是num向左移动一位,但编译器不会这样识别会出现错误值,使用移位操作符时不要移动负数位!
2.移位操作符总结.
移位操作符的操作数必须是整数,且移动的位不能是负数位,移位操作符是对数值的二进制补码进行移位,一般情况下向左移一位有扩大一倍的作用,右移一位有缩小二分之一的作用
三.位操作符
& 按位与操作符
| 按位或操作符
^ 按位异或操作符
注:他们的操作数必须是整数。
1.位操作符介绍
位操作符的操作数是要转换为二进制补码形式,对原来的操作数不会产生影响
①&按位与操作符
&按位操作符也是对二进制补码进行操作,表示相同位都是1时得到位为1,其他情况都得到的是0.
可以看到 当a为1 b为2时 a&b的值是0
a的二进制补码为00000000000000000000000000000001
b的二进制补码为00000000000000000000000000000010
它们相同位都为1则为1否则都为0,此时它们相同位没有都为1的此时得到的就是00000000000000000000000000000000 32个0,转化为原码为0
②|位或操作符
| 位或操作符是对二进制补码进行操作,表示 相同位上至少有一个1就为1,没有1则就为0.
可以看到当a|b时的结果为3
a的二进制补码为00000000000000000000000000000001
b的二进制补码为00000000000000000000000000000010
它们相同位有一个1为1则为1没有1则为0,此时它们相同位有两个是有1的此时得到的就是00000000000000000000000000000011 ,转化为原码输出为3.
③^异或操作符
^异或操作符是对二进制补码进行操作,作用是相异为1相同为0.
a^b的结果为3
a的二进制补码为00000000000000000000000000000001
b的二进制补码为00000000000000000000000000000010
它们相同位有两个位是不同的数其他的是相同的
此时得到的就是00000000000000000000000000000011 ,转化为原码输出为3.
2.位操作符总结
位操作符必须是整数,且是对整数的二进制补码进行操作,操作后数本身不会发生变化,只是得到了操作后的数.
四.赋值操作符
赋值操作符为 =
下面是复合赋值操作符
+=
-=
*=
/=
%==
<<=
&=
|=
^=
1.赋值操作符介绍
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
①=赋值操作符
这个操作符我们早已掌握,就是将一个变量里的数赋上自己想放的值,也可以再一次赋上新的值改变里面的值
一开始a里面的值赋为了1,后面a的值被赋为了2.
c语言里还存在连续赋值,此时表示a和b都赋值为了2,但不建议这样使用,因为这样可读性差,还不易修改.
② += 复合赋值符
复合赋值符都是一样的效果,这里只介绍一种,其他的都是相同的用法
复合赋值符a+=2实际上是a=a+2的缩写 ,它表达的意义就是将a本身的数加上相应的数字,会改变a本身的值,此时a里为3.
其他复合赋值符都是相同用法.
2.赋值操作符总结
赋值操作符会改变原先变量里面的值,可以连续赋值但不建议使用,复合赋值符a+=2就等同于a=a+2将自身的值再加上2赋值给自己
五.单目操作符
!逻辑反操作
负值
正值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 – 前置、后置– ++ 前置、后置++ * 间接访问操作符(解引用操作符) (类型) 强制类型转换
1.单目操作符介绍
单目操作符表示它们只有一个操作数,对那个操作数生效
① !逻辑反操作
!逻辑反操作 表示将操作数原来的逻辑取反 当操作数表达为真则为假 当操作数本身是假则变为真
在if表达式里为 !a 此时a里面的值为0 表示假,但!a逻辑反操作 表示为真,此时运行该分支,打印出a为0,如果没有! 则不会打印.
②-负值操作符
负值 放在一个操作数前面表示它变为负数,但当有两个负值时表示这个数为正数
此时a为1 而b里面为-a此时为-1,而a又赋值为-a也为-1此时a和b里面的值都为-1.
③+正值操作符
放在一个数前面表示该数为正数,一般直接是省略的
a里面1 b里面为+a也就是+1 也为1 .
④&取地址操作符
&取地址操作符 表示将后面的数的地址取出来,即为一个地址
此时a是一个整形变量,&a表示将整形变量a即a在计算机内部申请的整形空间的地址取出来,%p为打印地址,此时将a的地址打印出来.
⑤sizeof 操作数
sizeof在之前博客里就讲到 它是对后面一个操作数得出它的类型长度(单位字节)
sizeof 可以求类型长度 也可以求类型创建的变量的空间长度,但操作数是类型时要用括号括起来.%zu是专门用来打印 sizeof求出来的类型的长度的此时表示整形长度为4字节 即整形创建的变量a的内存空间大小为4字节.
⑥~取反操作符
~取反操作符对一个操作数的二进制补码进行操作 将其二进制位取反,即1变为0,0变为1
此时a里面为0,二进制补码为32个0,此时对其取反0变为1,此时为32个1,最高位为1表示符号位为负数,此时转换为原码为-1,将其输出为-1.
⑦- -和++前置.后置操作符
- -和++可以放在操作数(是一个变量)前面后者后面 是两种不同用法
放在前面表示将这个变量里的值自加1或者减1然后再使用,放在后面则是先使用当前变量 然后变量里的值自加或自减1.
此时a里面为0,b里面为-1,而printf库函数 右边的输出项是从右往左运算的,先运算a++再算a–.此时a++表示先使用a的值此时a++为0,然后a里面自加1a为1,然后再++a表示a先自加1然后再使用这个值,此时a自加1为2,然后++a就为2,此时输出++a为2,a++此时为0,
b里面为1 b–表示为1然后b自减1b里面为0,此时–b表示b=b-1 为0-1 b里面此时为-1即–b为-1 此时打印值为 -1 和1.
⑧*解引用操作符
*解引用操作符是和&取地址操作符连用的,取出地址后,可以通过解引用操作符访问该地址指向的内容.
此时a是一个整形变量 &a为a的地址 此时以整形打印出来这个地址是一个不确定的值,而将其解引用后为访问这个地址指向的内容即访问a,此时a里面为0,则输出了0.
⑨(类型)强制类型转换操作符
(类型)表示一个括号里面写一个类型,后面跟着操作数 表示将这个操作数强制转换为括号里的类型.
此时a是一个整形变量里面存了1,将其变量a转换为float单精度浮点型,此时里面存的就是一个浮点数 ,打印浮点数此时为1.000000
2.单目操作符总结
单目操作符对象都是一个操作数,有些操作符难以理解要多加练习尤其是+±-操作符
六.总结
本人有点懒,操作符讲解分上下两篇博客,此篇讲了五种操作符类型,在下篇博客会继续补充省下的操作符,每一个操作符存在都有它的意义,我们只有理解了每一种操作符才能更上一层楼,
文章有什么错误的地方请多指出,本人当虚心接受,第一时间作出修改…
写文不易,给个一键三连支持下叭~
版权归原作者 牛牛要坚持 所有, 如有侵权,请联系我们删除。