java之运算符

30 阅读2分钟

运算

算术运算

  1. char和数值类型才可以进行算数运算
  2. +,-,*,/,% 在运算时会发生自动类型提升(char、byte、short -> int -> long -> float -> double),例如int和long发生运算,会视作long和long运算

“+”(加运算),“-”(减运算),“*”(乘运算),“/”(除运算)

  1. char、byte、short进行+运算的时候,视为int进行运算
  2. 运算结果的类型为参与运算方在自动类型提升中最高的类型
float f1 = 123.34f + 123; // float类型和int类型进行运算的时候,结果为float类型
float d1 = (float)(123.34f + 123.45); // 如果需要改变运算结果类型,就需要使用强制类型转换
  1. 如果使用强制类型转换改变结果类型,可能会存在精度丢失的问题

“%”(取余)

int i1 = 5 % 2; // 结果为1
int i2 = -5 % 2 // 结果为-1
int i3 = 5 % -2 // 结果为1
  1. char、byte、short进行+运算的时候,视为int进行运算
  2. 运算结果的类型为参与运算方在自动类型提升中最高的类型
  3. 如果存在负数,那么运算结果的符号取决于运算符左侧数值的符号

++(自增1),--(自减一)

  1. 在运算的时候不会改变运算结果的类型,例如short不会变为int
  2. 自增/自减运算符在前,表示优先进行自增/自减,后计算表达式的值,在后,表示先计算表达式的值,后进行自增/自减。
int i1 = 1; 
++i1; // 表达式的值为2,i1最终的值为2
i1++; // 表达式的值为2,i1最终的值为3

String类型+运算(连接运算)

  1. String类型和任意基础数据类型进行+运算,视为连接运算
String s1 = "123" + true; // 结果为"123true"
String s1 = "123" + 0; // 结果为"1230"
String s1 = "123" + 1.23f; // 结果为"1231.23"

移位运算

  1. char和数值类型才可以进行算数运算

"<<" (左移运算符)

  1. 补码左移n位,空位补0, 符号位也参与移动
  2. 如果不发生溢出,相当于乘法运算,只不过是乘以2^n
  3. 如果n过大,会出现溢出的问题
int i1 = 1 << 2; // 等同于1 * 2^2,等于4

">>"(有符号右移运算符)

  1. 补码右移n位,如果符号位是0,则空位补0, 如果符号位是1,则空位补1
  2. 如果不发生溢出,相当于除法运算,只不过是除以2^n
  3. 可能会存在精度丢失
int i1 = 5 >> 1; // 等同于5 / 2^1,等于2 

">>>"(无符号右移运算符)

  1. 补码右移n位,不论符号位是0或1,空位始终补0

关系运算

“>”,">=","<","<="

  1. char和数值类型才可以进行比较运算

"==","!="

  1. 基本类型数据和引用类型数据均可以进行相等运算判断
  2. 基本类型数据会发生自动类型提升,然后比较结果是否相等
  3. 引用数据类型,比较地址是否相同

位运算

  1. 值可以是数值,char,和boolean值

"&"

  1. 只有当前位都为1的时候才是1,否则都为0

"|"

  1. 只要存在1,结果就为1

"~"

  1. 按位取反

"^"

  1. 有一个为0,另一个为1时,才为1
  2. 0和任何数异或,都为数本身
  3. 1和任何数异或,都相当于对数进行取反
  4. 任何数和自身进行异或,结果为0

逻辑运算

  1. boolean类型才可以进行逻辑运算

“&&”,“||”

  1. 左边符合条件后,右边的表达式不会再执行

"&","|"

  1. 左边符合条件后,右边的表达式还会再执行
  2. 不太使用

"!"

条件运算

? :

  1. 如果为true,则执行:左边的表达式,否则执行右边的表达式
  2. 左右两边的表达式结果类型必须相同,会发生自动类型提升

赋值运算

“=”

  1. 将表达式最后的运算结果赋给变量
  2. 如果运算结果的类型和变量的类型不相同,则会存在以下2种情况: 2.1 运算结果可以通过自动类型提升变成变量类型 ,则会发生自动类型提升 2.2 运算结果不可以通过自动类型提升变成变量类型 ,则会编译报错
int i1 = 1;
int i2 = 2;
double l1 = 1 + 2; // 则l1的值为3.0
int i1 = 1;
int i2 = 2;
short s1 = 1 + 2; // 编译报错

“+=”,“-=”,“*=”,“/=”,“%=”,“&=”,“^=”,“|=”,“<<=”,“>>=”

  1. 在运算的时候不会改变运算结果的类型,例如short不会变为int
  2. 先进行计算,后进行赋值
short s = 1;
s+=1;// 类似于s = s + 1,但是不同的是+=最终运算结果还是short,而不是int