目录
一、操作符分类
二、算术操作符
三、位移操作符
1、<< 左位移操作符号
2、>> 右位移操作符
四、位操作符
1、& --- 按位与
2、| --- 按位或
3、^ --- 按位异或
变态题
五、赋值操作符
符合赋值符
一、操作符分类
操作符也被称为运算符。
算术操作符
位移操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
二、算术操作符
+ - * / %
1、除了%操作符(取模)之外,其他的几个操作符可以作用于整数和浮点数。
2、对于/操作符,如果两个操作数都为整数,执行的是整数除法,如果向计算出小数,则除号两端至少有一个操作数是浮点数。(操作数指的是下面10和3)
3、%操作符的两个操作数必须为整数。返回的是整数之后的余数。
三、位移操作符
<< 左位移操作符
>> 右位移操作符
移位操作符移的是补码的二进制位。
注:位移操作符的操作数只能是整数!
在讲之前,先为大家补充整数二进制表示形式(3种)
1、<< 左位移操作符号
正数的案例:
解释如下图:
左移操作符移位规则:左边丢弃,右边补0,且b打印的是原码的值。
注: a<< 1的结果是移位之后的效果,但是a的值是不变的。
负数的案例:
解释如下图所示:
对于负值,左移操作符还是左边丢弃,右边补0,且b打印的是原码的值。
所以最后-10的补码要转换成原码才是b的结果。
注:即使是负值, a移位之后,a的值还是不变。
最后有没有发现,左移有×2的效果。
2、>> 右位移操作符
首先右移运算分为两种:
①逻辑位移(不讲,和左移操作符差不多)
左边补0,右边丢弃
②**算术位移(常见)
左边用原该值的符号位填充,右边丢弃
注:逻辑位移算术位移取决于编辑器,一般都是算术位移。
②**算术位移
解释如下图所示:
警告⚠:
对于位移运算符,不要移动负数位,这个是标志未定义的。
四、位操作符
位操作符有
& --- 按位与
| --- 按位或
^ --- 按位异或
注:它们的操作数必须是整数,同时也是针对二进制位进行计算的。
1、& --- 按位与
计算规则:对应的二进制位上,有0则为0,两个同时为1,才为1。
解析:首先a&b一定是二进制位进行计算,也就是存到内存中的补码进行计算,a的补码为00000000000000000000000000000011,b的补码为11111111111111111111111111111011,根据按位与的计算规则,按位与结果(补码):00000000000000000000000000000011,最后还要转化成原码,由于正数的原码、反码、补码都是一样的,所以最后打印结果为3。
2、| --- 按位或
计算规则:对应的二进制位上,有1则为1,两个同时为0,才为0。
解析:首先a | b还是二进制位进行计算,a的补码为00000000000000000000000000000011,b的补码为11111111111111111111111111111011,根据按位或的计算规则,按位与结果(补码):11111111111111111111111111111011,最后还要转化成原码,但是由于按位或结果就是b的补码,所以最后打印结果为-5。
3、^ --- 按位异或
计算规则:对应的二进制位,相同为0,相异为1。
解析:首先a ^ b还是二进制位进行计算,a的补码为00000000000000000000000000000011,b的补码为11111111111111111111111111111011,根据按位异或的计算规则,按位与结果(补码):11111111111111111111111111111000,最后还是要转化成原码,原码:10000000000000000000000000001000(1*2的3次方),所以结果为-8
接下来,插播一道变态题
要求:不能创建临时变量(第三个变量),实现两个整数的交换。
首先假设可以创建临时变量:
那不创建临时变量应该怎么做呢?接着往下看
但是这个方法有一个缺陷,如果a和b的数字太大的时候,超出范围就会溢出。
那应该怎么办呢?接着往下看
解析:
异或操作符的缺点
1、可读性差
2、效率不如使用临时变量的方法
3、异或只能针对整数的交换
五、赋值操作符
赋值操作符是一个很棒的操作符,它可以让你得到一个你之前不满意的值,也就是你可以给自己重新赋值。
int weight = 120; //初始化赋值
weight = 130; //不满意就赋值
//赋值操作符还能连续使用
int a = 10;
int x = 20;
int y = 30;
a = x = y + 1; //连续赋值(赋值顺序从右往左)
//或者还能这么写(好的写法)
x = y + 1;
a = x;
//这样的写法是不是更加容易调试
符合赋值符
目的就是为了简化代码。
+= a+=5实际上就是a=a+5
-= a-=5实际上就是a=a-5
*= a*=5实际上就是a=a*5
/= a/=5实际上就是a=a/5
%= a%=5实际上就是a=a%5
>>= b = b>>1可以写成b>>=1
<<= b = b<<1可以写成b<<=1
&= b = b & 1可以写成b&= 1
|= b = b | 1可以写成b|= 1
^= b = b ^ 1可以写成b^= 1