基本运算符与位运算符
算术运算符:两个操作数进行计算
+ 加
- 减
* 乘
/ 除(取整)
% 取余
例子:
class ArrayTest{
public static void main(String[] args){
int num1 = 12;
int num2 = 5;
int num3 = num1 / num2;
double num4 = num1 / num2 + 0.0;
double num5 = (num1 + 0.0) / (num2 + 0.0);
double num6 = num1 / (num2 + 0.0);
System.out.println("num3="+num3);//2
System.out.println("num4="+num4);//2.0
System.out.println("num5="+num5);//2.4
System.out.println("num6="+num6);//2.4
//%取余运算
int m1 = 12;
int n1 = 5;
System.out.println("m1%n1="+m1%n1);//2
int m2 = -12;
int n2 = 5;
System.out.println("m2%n2="+m2%n2);//-2
int m3 = 12;
int n3 = -5;
System.out.println("m3%n3="+m3%n3);//2
int m4 = -12;
int n4 = -5;
System.out.println("m4%n4="+m4%n4);//-2
}
}
编译运行:
自增与自减
++ 自增
-- 自减
例子:
class ArrayTest{
public static void main(String[] args){
//前++
int a1 = 10;
int b1 = ++a1;//a1自加1后赋值给b1
System.out.println("a1="+a1+" "+"b1="+b1);
//后++
int a2 = 10;
int b2 = a2++;//a2赋值给b2后再自加1
System.out.println("a2="+a2+" "+"b2="+b2);
//前--
int a3 = 10;
int b3 = --a3;//a3自减1后赋值给b3
System.out.println("a3="+a3+" "+"b3="+b3);
//后--
int a4 = 10;
int b4 = a4--;//a4赋值给b4后再自减1
System.out.println("a4="+a4+" "+"b4="+b4);
}
}
编译运行:
a++比++a在运行速度上快一点,a--比--a在行速度上快一点。
赋值运算符:
=
扩展的赋值运算符:+= *= -= /= %=
例子:
class ArrayTest1{
public static void main(String[] args){
//=
int i1 = 10;
int j1 = 10;
//连续赋值
int i2,j2;
i2 = j2 = 10;
int i3 = 10,j3 = 10;
//*****************
int num1 = 10;
num1 +=2;//num1 = num1 + 2;
System.out.println(num1);
int num2 = 12;
num2 %= 5;//num2 = num2 % 5;
System.out.println(num2);
short s1 = 10;
//s1 = s1 + 2;编译失败 左边short 右边至少得用int接收
s1 += 2;//不会改变变量本身的数值类型
System.out.println(s1);
//开发中,如果希望变量实现+2的操作,有几种方法?(int num = 10)
//1.num = num + 2
//2.num +=2(推荐)
}
}
编译运行:
关系运算符(会形成布尔表达式)--比较运算符
>
<
>=
<=
== a=b赋值 a==b表判断
!=
逻辑运算符
短路逻辑运算符:
当使用与逻辑运算符(短路与)时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。
当使用与逻辑运算符(短路或)时,在两个操作数只要有一个为true时,结果就为true,但是当得到第一个操作为true时,其结果就必定是true,这时候就不会再判断第二个操作了。
&& 短路与 ,与(并且), 都为真才为真
|| 短路或,或(或者),只要有一个为真就为真
! 逻辑非(取反), 真变假,假变真
三元运算符(可以嵌套使用)
? : 布尔表达式?结果1:结果2 布尔表达式为真(true),获得结果1,否则为结果2
凡是有三元运算符的地方,都可以改写成if-else
位运算符:
&(非短路) 逻辑与,a&b按二进制求与
|(非短路) 逻辑或,a|b按二进制求或
^ 逻辑异或,a^b异或 相同时为0,不同时为1 任何一个数与0异或,还是原来的那个数
~ 按位置求反 按二进制求反 1变0,0变1
a=27 16+8+2+1 00011011
~a=-27 11100101 符号位甩出去, 0011011 -27
移位运算符
a=26
a=a>>1右移运算符
整体往右移1位 00011010 右移后 0(符号位还是原来的)0001101
a=13
结论:右移一位值为原来的一半,所以左移<
a=20
a>>>1 a=10
a>>1 a=10
a=-20
a>>>1 a=2147483638(符号位丢了,0补了上去)
a>>1 a=-10
运算符的优先级(在表中最上边的优先级最高,从上往下依次递减)
后缀
() [] . (点操作符)
左到右
一元
expr++ expr--
从左到右
一元
++expr --expr + - ~ !
从右到左
乘性
* /%
左到右
加性
+ -
左到右
移位
>> >>> <<
左到右
关系
> >= < <=
左到右
相等
== !=
左到右
按位与
&
左到右
按位异或
^
左到右
按位或
|
左到右
逻辑与
&&
左到右
逻辑或
| |
左到右
条件
?:
从右到左
赋值
= + = - = * = / =%= >> = << =&= ^ = | =
从右到左
逗号
,
左到右