运算
算术运算
- char和数值类型才可以进行算数运算
- +,-,*,/,% 在运算时会发生自动类型提升(char、byte、short -> int -> long -> float -> double),例如int和long发生运算,会视作long和long运算
“+”(加运算),“-”(减运算),“*”(乘运算),“/”(除运算)
- char、byte、short进行+运算的时候,视为int进行运算
- 运算结果的类型为参与运算方在自动类型提升中最高的类型
float f1 = 123.34f + 123
float d1 = (float)(123.34f + 123.45)
- 如果使用强制类型转换改变结果类型,可能会存在精度丢失的问题
“%”(取余)
int i1 = 5 % 2
int i2 = -5 % 2 // 结果为-1
int i3 = 5 % -2 // 结果为1
- char、byte、short进行+运算的时候,视为int进行运算
- 运算结果的类型为参与运算方在自动类型提升中最高的类型
- 如果存在负数,那么运算结果的符号取决于运算符左侧数值的符号
++(自增1),--(自减一)
- 在运算的时候不会改变运算结果的类型,例如short不会变为int
- 自增/自减运算符在前,表示优先进行自增/自减,后计算表达式的值,在后,表示先计算表达式的值,后进行自增/自减。
int i1 = 1;
++i1;
i1++;
String类型+运算(连接运算)
- String类型和任意基础数据类型进行+运算,视为连接运算
String s1 = "123" + true
String s1 = "123" + 0
String s1 = "123" + 1.23f
移位运算
- char和数值类型才可以进行算数运算
"<<" (左移运算符)
- 补码左移n位,空位补0, 符号位也参与移动
- 如果不发生溢出,相当于乘法运算,只不过是乘以2^n
- 如果n过大,会出现溢出的问题
int i1 = 1 << 2; // 等同于1 * 2^2,等于4
">>"(有符号右移运算符)
- 补码右移n位,如果符号位是0,则空位补0, 如果符号位是1,则空位补1
- 如果不发生溢出,相当于除法运算,只不过是除以2^n
- 可能会存在精度丢失
int i1 = 5 >> 1
">>>"(无符号右移运算符)
- 补码右移n位,不论符号位是0或1,空位始终补0
关系运算
“>”,">=","<","<="
- char和数值类型才可以进行比较运算
"==","!="
- 基本类型数据和引用类型数据均可以进行相等运算判断
- 基本类型数据会发生自动类型提升,然后比较结果是否相等
- 引用数据类型,比较地址是否相同
位运算
- 值可以是数值,char,和boolean值
"&"
- 只有当前位都为1的时候才是1,否则都为0
"|"
- 只要存在1,结果就为1
"~"
- 按位取反
"^"
- 有一个为0,另一个为1时,才为1
- 0和任何数异或,都为数本身
- 1和任何数异或,都相当于对数进行取反
- 任何数和自身进行异或,结果为0
逻辑运算
- boolean类型才可以进行逻辑运算
“&&”,“||”
- 左边符合条件后,右边的表达式不会再执行
"&","|"
- 左边符合条件后,右边的表达式还会再执行
- 不太使用
"!"
条件运算
? :
- 如果为true,则执行:左边的表达式,否则执行右边的表达式
- 左右两边的表达式结果类型必须相同,会发生自动类型提升
赋值运算
“=”
- 将表达式最后的运算结果赋给变量
- 如果运算结果的类型和变量的类型不相同,则会存在以下2种情况:
2.1 运算结果可以通过自动类型提升变成变量类型 ,则会发生自动类型提升
2.2 运算结果不可以通过自动类型提升变成变量类型 ,则会编译报错
int i1 = 1
int i2 = 2
double l1 = 1 + 2
int i1 = 1
int i2 = 2
short s1 = 1 + 2
“+=”,“-=”,“*=”,“/=”,“%=”,“&=”,“^=”,“|=”,“<<=”,“>>=”
- 在运算的时候不会改变运算结果的类型,例如short不会变为int
- 先进行计算,后进行赋值
short s = 1
s+=1;// 类似于s = s + 1,但是不同的是+=最终运算结果还是short,而不是int