运算符的优先级
算术运算符
+、-、*、/、%、++、--
注意:i++是先赋值后加1,++i是先加1后赋值;i--是先减1后赋值,--i是先减1后赋值
关系运算符
>、<、>=、<=、==、!= 关系运算符比较的结果是布尔类型
赋值运算符
=、+=、-=、*=、/=、%=
int i = 10;
i+=2;
相当于i=i+2;
i*=2;
相当于i=i*2;
i/=2;
相当于i=i/2;
i%=2;
相当于i=i%2;
逻辑运算符
!非(取反)、||或(至少有一个为真,整体为真)、&&与(同时为真才为真)
注意例子||(或)
Java 中以下代码
int a = 1;
boolean b = (a>0) || (a++>1);
执行后,变量 a 和 b 的值为?
b=true,a=1;
注意在或里面执行,因为前面已经是(a>0)=true,所以后面就不执行了,所以后面的(a++>1)就不执行
如果(a++>1)放到前面,就会执行,后面结果a=2
三元运算符
(表达式)?表达式1:表达式2;
表达式值为true 结果为表达式1,表达式值为false 结果为表达式2
位运算符
计算机对整数都是按二进制进行操作,按位非(~),按位与(&),按位或(|),按位异或(^),移位运算符(<<,>>,>>>) 具体理解看例子
实际上这些二进制的0和1之间没有空格,这样写为了便于辨别区分。
按位非~
按位非~
0000 0110 6
1111 1001 -7
原码:1000 0111
反码:1111 1000
加1: 1111 1001
把6的二进制取反得到是负数,负数以补码存储,然后这个二进制就是补码,在通过补码往前推,减1,再取反就得到了-7的原码
*/
byte b1 =6;
System.out.println(~b1);
结果为-7
按位与&
按位与&
0000 0101 5
0000 0010 2
最后取: 0000 0000 0
两者中 如果是相同的1就取1,不同的就取0
System.out.println(5&2);
最后值为0
如果是5&3
0000 0101 5
0000 0011 3
最后取: 0000 0001 1
最后值为1
按位或 |
按位或 |
0000 0101 5
0000 0011 3
0000 0111 7
只要二者有其中至少有一个1,就取1
System.out.println(5&3);
最后取值为7
按位异或^
按位异或^
0000 0101 5
0000 0011 3
0000 0110 6
两者中 不同的就取1,相同的就取0
System.out.println(5^3);
移位运算符>>、<<、>>>
移位
向左移<<
int i =6<<2;
0000 0110 6
0001 1000 24
向左移,每向左移动几次,代表乘几次2
前面整数的二进制 向左移几位
System.out.println(i);
最后输出的24
向右移
向右移动以后,如果是一个正数,左边用0来补齐;如果是一个负数,左边用1来补齐
int i2 = 6>>2;
0000 0110 6
0000 0001 1
向右移2位,前面的用0补齐
System.out.println(i2);
输出的是1
int i3 = -7>>2;
1111 1001 -7
1111 1110 -2
原码:1000 0010
反码:1111 1101
加1: 1111 1110
以-7的补码向右移然后前面的用1补齐
最后得到一个负数的补码,再往前推,先减1,在取反
System.out.println(i3);
最后输出的-2
无符号右移>>>
无论是正数还是负数,左边都用0来补齐
因为前面-7默认定义的是int型,占4个字节
-7
11111111 11111111 11111111 11111001
00111111 11111111 11111111 11111110
System.out.println(-7>>>2);
最后的结果为:1073741822