Java运算符总结+细节
不改变本身数据类型的两个运算符:++ & +=
算术运算符:+ - (正负)| + - * / | % | (前)++(后)++
(前)--(后)-- | + (str连接)
-
int / int ---> int
-
如果两个整型运算想得到浮点型,需要把其中一个整型先变为浮点型!
int num1 = 12;
int num2 = 5;
double num3 = num1 / num2; // 2.0 因为num1 / num2 --> 2, 然后int自动类型提升到double,所以是2.0
//Expect to get 2.4;
double num3 = (float)num1 / num2; // (float)可加在num1 或者num2
OR
double num3 = num1 / (num2 + 0.0); // make 分母为double,然后int / double --> double
// %模运算
int num1 = 12, int num2 = 5; num1 % num2 = 2; //被模数num1 为正;
int num1 = -12, int num2 = 5; num1 % num2 = -2; //被模数num1 为负;
int num1 = 12, int num2 = -5; num1 % num2 = 2; //被模数num1 为正;
int num1 = -12, int num2 = -5; num1 % num2 = -2; //被模数num1 为负
|
++(自增1)
|
--(自减1)
|
在前(++a)
|
先运算,后取值
|
先运算,后取值
|
在后 (a++)
|
先取值,后运算
|
先取值,后运算
|
//自增与逻辑运算符结合
int i1 = 1;
i1++==2; // False 后++,先比较,再运算,所以1 != 2, 然后i1 += 1;
自增/自减不会改变变量自身的类型!
short a = 3;
a = a + 1 // a变为int,编译不通过
a++ // a还是short
int num = 10;
num++ // ++num
int num1 = num; // 11, 把自增与运算分开,那么++在前还是在后没有区别!
赋值运算符:
连续赋值
int i1, j1;
i1 = j1 = 10; // same values
///
int i2 = 10, j2 = 13; // diff values
*
+= 不改变变量本身数据类型!
short s1 = 10;
s1 = s1 + 2; //编译不通过,因为s1 + 2是int!
//用强转符转2也不行,因为short + short --》 int
s1 = s1 + (short)2 // 编译不通过!
s1 = (short)(s1 +2) // OK
//**************************** better solution
s1 += 2 // 编译通过,这种方式不改变变量的数据类型!
比较运算符:
易错点:
int i = 10;
int j = 20;
System.out.println(i = j);// 20
// 执行了两个操作 1)将j的值赋给i 2)print i
-
(>, <, >=, <=)只适用于数值型,不适用与String
-
== 和 != 可用于引用类型
逻辑运算符:
-
逻辑异或:a和b不相同时为T,否则为F。
-
& | ^ 双元/目运算符
-
!单元/目运算符
-
与的情况:只有符号左右两边均为True时,结果才会为True
-
所以发现符号左边是False时,就没有必要去看符号右边的运算了-----》短路与;继续执行符号右边的运算,逻辑与
-
或的情况:只有符号左右两边均为False时,结果才会为False
-
所以发现符号左边是Ture时,就没有必要去看符号右边的运算了-----》短路或;继续执行符号右边的运算,逻辑或
*
开发中,优先使用短路与/或。
位运算符:
-
逻辑还是位运算,取决于符号两边是整型还是bool
-
不是无限制位移!当binary数第一位从0变为1或者1变为0之后,表示的数字正负会发生改变!
-
左移--》空出来的位置用0补
-
右移 ---》空出来的位置根据二进制表达式的正负来补上0或者1
&:
与运算 二进制表示中,0为False,1为True; 所以(0, 1)--》0;(1, 1)--》 1
|:
或运算 二进制表示中,0为False,1为True; 所以(0, 1)--》1;(1, 1)--》 1;(0, 0)--》0
^:
异或运算 两个数相同时才为0,其余均为1.
~:
取反,包括
符号位在内都取相反的数(0,1)
-
Method2: 不用定义临时变量,节省内存空间
-
坏处:相加可能超出存储的范围;局限性:只适用于数值类型
方法三:
-
异或:m^n = k; k^n = m; k^m = n
-
不用担心超出存储范围
-
但是也局限于数值类型
int num1 = 10;
int num2 = 5; // Exchange num1 and num2
-
num1 ^ num2 的值赋给num1;
-
新的num1 异或 num2,得到的值为原num1,也就是10,将这个值赋给num2;
-
现在num1的值还是num1^num2,这时候num1 ^ num2(新,值为10)得到原num2,也就是5,赋给num1,实现调换数值。
-
Attention! 非int型进行异或运算之后变为int!e.g. short n1, n2; n1 = n1 ^ n2 // 编译失败!
-
Solution:用 赋值运算进行异或!e.g. n1 ^= n2; //编译通过
三元运算符:
或者说表达式1和2需要能统一为一个类型!
三元运算符嵌套:
表达式2 用一个新的三元运算符替代
运算符优先级:
-
最高的是 算数运算符的(++,--)以及 逻辑运算符的(反,非) 右往左
-
接下来是算数运算符的(* / %)再下一级(+ -)
-
接下来 位运算符的移动(<<, >>, >>>)
-
接下来是 比较运算符的大小(等于)及包含关系
-
比较运算符的等于或不等
-
接下来是 逻辑运算符的与,异或和或
-
短路逻辑运算符 短路与之后是短路或
-
三元运算符 右往左
-
赋值运算符排在最后面
-
赋值,乘除余赋值
-
加减,左右移赋值
-
无符号赋值及逻辑赋值
-
boolean x = X1 == X2 // 不需要(),“==” 优先于“=”