Java运算符
1.算术运算符
+ 正号、加号,连接字符串
注意 “+” 遇到字符串,才变成字符串连接符,如"System.out.println(3+4+"3+4"+5+6);的结果是73+456
任何类型只要和字符串+, 所有的数据都变成了字符串
public class Operator { public static void main(String[] args){ boolean b = true; String s = "abc"+b; System.out.println(s);//输出 abctrue } }
- 减号,负数
* 乘号
/ 除号
注意当除号两边为整数时,取整数部分,舍余数。当其中一边为浮点型时,按正常规则相除。
% 取余
小数取余没有意义。结果符号与被取余符号相同。
对于除法运算和取模运算:
整数做被除数时,0不能做除数,否则报错。
小数做被除数时,整除0结果为Infinity,对0取模结果为NaN
++ 自增
-- 自减
i++与++i的区别
我们常说i++先用后加,++i先加后用。
首先,单独的i++与++i,这个表达式独立计算的时候,没有任何区别,字节码是完全一样的。就是单纯把 i所在的局部变量表那个位置的值加1。
但是变量如果参与了其他运算,就有区别了
i++ 和 ++i 只有在最终赋值给某变量时(实际上是因为参与了运算,因为直接赋值也是一种无运算符号的运算),字节码指令是不同的,而且也只是顺序上的不同。
区别是
- i++:先将局部变量表中的 i 放入操作数栈中,再将局部变量表中的 i 值 +1
- ++i:先局部变量表中的 i 值 +1,再将i放入操作数栈中
参考:显微镜下的i++与++i
2.赋值运算符
= += -= *= /= %=
注意:诸如+=这样形式的赋值运算符,会将结果自动强转成等号左边的数据类型。
如下代码编译不会通过
byte b=1; b = b+1;
因为b是byte类型,1是int类型,相加时b自动被提升成int类型,相加的结果应该是int类型。把int类型的值赋值给byte类型的值会报错。
而如下代码可以编译通过
byte b=1; b += 1;
因为类似 += 这种运算符,会将结果自动强转成等号左边的数据类型。b+=1是一次运算,而b=b+1是两次运算(先计算b+1的值,再将b+1的值赋给b)
b += 1; 等价于 b = (byte)(b+1);
3.比较运算符
== != > < >= <=
比较运算符两边的操作数的大小关系,结果为true或false
4.逻辑运算符
& | ! ^ && ||
逻辑运算符两边的操作数均为布尔值,如
System.out.println(1&true);
编译会报错“ 二元运算符 '&' 的操作数类型错误”
表达式的运算结果也是布尔值
&&(短路与)左边为false,则结果为false且右边不执行;||(短路或)左边为true,则结果为true且右边不执行
&&、||与&、|相比更有效率,所以我们一般采用&&、||。
5.三元运算符
格式:
(条件表达式)?表达式1:表达式2;
若条件表达式的值为true,则运算结果为表达式1,反之,为表达式2。
运算符有优先级,赋值运算符优先级最低,不确定的优先级的时候加上小括号即可。