一、关系运算符
+ - * / % ++ --
理解:x++,++x。两者都是自增1,区别在于如果存在赋值情况,前者是先赋值,在自增,后者是先自增,在赋值。
举例:
int x = 1; y = x++; system.out.print(y"+" x); y=? x= ? 答案:y = 1, x = 2 z = ++x; system.out.print(y"+" x); z = ? x = ? 答案:z = 2,x = 2 或者: int x = 1; x = x++; x = ? 答案:x = 1。 为什么? 开辟空间x,存入常量1,赋值运算时,会先把值拿出来做副本,最后在把这个值赋回去。 x = ++x; x = ? 答案:x = 3。
二、比较运算符
> < == != instanceof类
三、赋值运算符
= +=
举例: byte x = 1; x = x + 2; 会有什么问题??? 编译错误,需要强制转换。将一个32位整型赋值给8位的数据类型需强制转换。 应该是:x = (byte)x + 2; x+=2; 不会出问题。+=会自动提升位数。将8位自动提升为32位。
四、逻辑运算符
& | ^逻辑异或 &&短路与 ||短路或
^理解:两边结果不一样,就为true。
五、位运算符
& 按位与 | 按位或 ^按位异或, <<按左位移, >>按右位移。 >>>按位右移(无符号) ~ 反码
理解:基于二进制进行运算的。计算机中的整数或者负数,都是以补码的形式存储的,反码是一种表现形式。
原码:转换为二进制。 反码:按位取反。 补码:得到的反码+1。
位移:
6<<2,向左移动2位,后面补0。值为6*2的移动位次幂6 *2的2次方,即6*4=24,这是结果。
8>>1,向右移动2位,前面补0。值为8/2的位移次幂,即8/2的2次方,即8/2 = 4,这是结果。这里有符号的需要保留符号。
-6>>>1,这里右移,不需要保留符号,前面补充0。
原文:https://www.cnblogs.com/cnbp/p/12657012.html