操作符分类
- 1.算术操作符
- 2.移位操作符
- 2.1整数的二进制表示形式
- 2.2.左移操作符 <<
- 2.3.右移操作符 >>
- 3.位操作符**
- 3.1. &
- 3.2. |
- 3.3. ^
- 4.赋值操作符
- 5.单目操作符
- 5.1.单目操作符的介绍
- 5.2.sizeof和数组
1.算术操作符
🥳 加”+“ 减”-“ 乘”*“ 除”/“ 取模“%”
1、除了%操作符之外,其余的几个操作符可以用于整数和浮点数
2、%操作符的两个操作数必须为整数,返回的是整除后的余数
3、对于/操作符,如果两个操作数都为整数,执行整数除法,而只要有一个浮点数则执行浮点数除法
2.移位操作符
移动的是二进制位
普及一些知识🥰
👍10进制的数据中:都是0~9的数字组成的(我们生活中接触到的大多都是10进制表示的数,比如123、456、666)
👍2进制的数据中:都是0~1的数字组成的(比如数值10的2进制表示—1010)
👍8进制的数据中:都是0~7的数字组成的(比如数值10的8进制表示—12)
👍16进制的数据中:是由0-9和a-f组成的,并是由0~15来表示
2进制、8进制、10进制、16进制只不过是数值的表示形式而已 不要觉得神乎其神
2.1整数的二进制表示形式
整数是存放在整型变量中的,一个整型变量是4个字节–32比特位
整数的二进制表示形式有3种:原码、反码、补码
整数在内存中存储和运算的是:补码(2进制)
正整数的原码、反码、补码是相同的
负整数的原码、反码、补码要计算
🙌原码:把一个数按照正负直接翻译成二进制就是原码
比如5: 00000000000000000000000000000101
比如-5:10000000000000000000000000000101
最高的一位表示符号位,0表示正数,1表示负数
🙌反码:原码的符号位不变,其他位按位取反就是反码
🙌补码:反码+1
比如-5:
原码-10000000000000000000000000000101
反码-11111111111111111111111111111010
补码-11111111111111111111111111111011
2.2.左移操作符 <<
这里a没有改变,因为没有给a赋值,如果想让a改变,可以写成:a=a<<1或者a<<=1
🥳移动规则:左边丢弃,右边补0
2.3.右移操作符 >>
🥳移动规则:
1、算术右移:左边用原该值的符号位填充,右边丢弃
2、逻辑右移:左边用0填充,右边丢弃
那右移的时候到底是采用算术右移呢还是逻辑右移呢?交给编译器来一试究竟,上代码⬇️
👍由此可见,左边是用原该值的符号进行的填充,所以是采用了算术右移的方式
👍右移的时候采用哪种右移方式是取决于编译器的!
👍大部分编译器下都使用的是-算术右移
3.位操作符**
🥳这里的位:二进制位
🥳他们的操作数必须是整数
3.1. &
🥳对应的二进制位上如果有0则为0,也就是说两个对应的二进制位上全为1才为1
3.2. |
🥳对应的二进制位上如果有1则为1,全0才为0
3.3. ^
🥳对应的二进制位相同则为0,相异则为1
😁这里给大家上一道面试题:
🚨不能创建临时变量(第三个变量)实现两个数交换
我们大家肯定会想到创建一个临时变量tmp,然后进行a和b的交换,就像是交换一瓶醋和一瓶酱油一样,需要一个空瓶子,可是题中不允许创建第三个变量,那我们该怎么办呢?😕
我们可以这样:上代码⬇️
int main()
{
int a = 3;
int b = 5;
printf("交换前:a=%d,b=%d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后:a=%d,b=%d\n", a, b);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
那这是什么原理呢?
说明异或是支持交换律的
4.赋值操作符
赋值操作符是一个很棒的操作符,它可以让你得到一个你之前不满意的值,也就是你可以给自己重新赋值。
🙌复合赋值符: += -= *= /= %= >>= <<= &= |= ^=
➡️a=a+b可以写成a+=b; a=a>>1可以写成a>>=1; a=a&b可以写成a&=b…
🚨赋值和初始化要区别开:
初始化:创建变量并且直接赋给它一个值
赋值:对于已经创建好的变量进行修改
5.单目操作符
👉 !------> 逻辑反操作符
👉 - ------> 负值
👉 + ------>正值
👉 & ------>取地址
👉 sizeof ------> 操作数的类型长度(以字节为单位)
👉 ~ ------> 对一个数的二进制按位取反
👉 - - ------> 前置、后置- -(减减)
👉 ++ ------> 前置、后置++(加加)
👉 * ------> 间接访问操作符(解引用操作符)
👉 (类型) ------> 强制类型转换
5.1.单目操作符的介绍
👍 ! :原来为真变为假,原来为假变为真
例如:上代码⬇️
🚨0为假,非0为真
👍 & :取地址操作符用来取…的地址
👍 * :解引用操作符和&取地址操作符是一对,一来一去
例如:上代码⬇️
👍 sizeof :所占内存空间的大小
例如:上代码⬇️
也可以计算数组的元素个数⬇️
👍 ~ :对二进制位(补码)按位取反
🚨注意 :原码和反码之间转换符号位不变,但是按位取反符号位是需要改变的
例如:上代码⬇️
👍 ++ - -:前置:先++/- -,后使用; 后置:先使用,后++/- -
例如:上代码⬇️
👍 (类型) :强制类型转换
例如:上代码⬇️
🚨强制转换总归是不合适的,俗话说强扭的瓜不甜,非必要不用
5.2.sizeof和数组
🥳数组传参的时候实际上传的是数组首元素地址,所以接收的时候本质上是指针来接收, 即使是char 的地址,因为是指针变量,所以在x86环境下为4个字节(x64下为8字节),不要看不起人家,误以为看到是char就是1个字节*
总结🥰
以上就是操作符详解的上篇内容啦🥳🥳🥳🥳
欲知后事如何,请听下篇分解喽💕💕💕
创作写文不易,还多情各位大佬uu们多多支持哦🥰🥰🥰