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需要能统一为一个类型!
 表达式1和2不是一个类型,但是都可以统一为double(自动类型提升)
 
三元运算符嵌套:
表达式2 用一个新的三元运算符替代
 
 

运算符优先级:
 
 
  • 最高的是 算数运算符的(++,--)以及 逻辑运算符的(反,非) 右往左
  • 接下来是算数运算符的(* / %)再下一级(+ -)
  • 接下来 位运算符的移动(<<, >>, >>>)
  • 接下来是 比较运算符的大小(等于)及包含关系
  • 比较运算符的等于或不等
  • 接下来是 逻辑运算符的与,异或和或
  • 短路逻辑运算符 短路与之后是短路或
  • 三元运算符  右往左
  • 赋值运算符排在最后面
    • 赋值,乘除余赋值
    • 加减,左右移赋值
    • 无符号赋值及逻辑赋值
boolean x = X1 == X2 // 不需要(),“==” 优先于“=”
 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值