运算符是一种特殊的函数,它们具有一个或多个操作数并返回相应的值。操作数是被运算符用作输入的值,通常是字面值、变量或表达式。运算符可以是一元、二元或三元的,一元运算符有1个操作数,二元运算符有2个操作数,三元运算符有3个操作数。
算术运算符: +(加、正值) -(减、负值) *(乘) /(除) %(取余) ++(自增) --(自减)
除法运算,两个操作数是整型的,结果也会是整型的,舍弃掉小数部分;如果有一个数是浮点数,结果将自动转型为浮点型
取余运算,两个操作数是整型的,结果也会是整型的,如果有一个数是浮点数,结果将自动转型为浮点型。内部会转换为: a和b均是整数量,a%b=a-(a/b) *b,否则 a%b=a-(b*q),这里的q=(int) (a/b)。
自增自减运算,a++ 相当于 a = a + 1, a++ 是先运用在计算,++a 先计算在运用
关系运算符: ==(等于) !=(不等于) <(小于) <=(小于等于) >(大于) >=(大于等于)
" = “是赋值运算,” == "是等于运算
" > “、” < “、” >= “、” <= “只支持数值类型的比较,” == “、” != "支持所有数据类型的比较
关系表达式的运算结果是布尔值,两边的操作数必须是相同类型或相容类型的。
逻辑运算符: &(逻辑与) |(逻辑或) !(逻辑非) ^(逻辑异或) &&(短路与) ||(短路非)
操作数只能是布尔型,操作结果也是布尔型
& 和 && 的区别: && 左边是false时,不计算右边的表达式,左假即假; & 无论左边真假都会计算右边的表达式
位运算符: &(按位与) |(按位或) ~(按位取反) ^(按位异或) <<(左移) >>(带符号右移) >>>(无符号右移)
三目运算符: ?:(表达式1 ? 表达式2 : 表达式3)
其中表达式1的结果必须是布尔类型,否则报错。表达式2和表达式3必须是同类型。
赋值运算符: =、+=、-=、*=、/=、%=、&=、|=、<<=、>>=、>>>=
运算符的优先级
括号级别最高,逗号级别最低,单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值。
指针最优,单目运算优于双目运算。如正负号。先乘除,后加减。先算术运算,后移位运算,最后位运算。逻辑运算最后计算。
方括号点圆括号,正负,非加加减减,乘除,加减,移位,大小包含,等不等,与,异或,或,短路与,短路或,条件,算术赋值,位赋值。
如果要改变运算顺序,可以使用圆括号。
|
优先级
|
描述
|
运算符
|
结合性
|
|
|
1
|
括号、方法调用、成员
|
[] . ( ) (方法调用)
|
|
|
|
2
|
正负号
|
+、-
|
从右向左
|
|
|
3
|
算术运算符: 自增自减,逻辑运算符: 非,位运算符: 按位取反
|
++、--、!、~
|
从右向左
|
~: 按位取反,1变0,0变1
!: false变true,true变false
|
|
4
|
算术运算符: 乘除,取余
|
*、/、%
|
|
|
|
5
|
算术运算符: 加减
|
+、-
|
|
|
|
6
|
移位运算
|
<<、>>、>>>
|
|
>>>:无符号右移,左边空位补0
>>: 带符号右移,左边空位补符号位
<<: 左移,右边补0
|
|
7
|
关系运算符: 大小关系
|
>、>=、<、<=、instanceof
|
|
变量名 instanceof 类名或接口名,如果是其子(孙)类,则返回true
|
|
8
|
关系运算符: 相等关系
|
==、!=
|
|
|
|
9
|
位运算符: 按位与
逻辑运算符: 逻辑与
|
&
|
|
按位与: 两个都是1,结果为1,否则为0
逻辑与: 左边无论取值真假,右边都会计算
|
|
10
|
位运算符: 按位异或
逻辑运算符: 逻辑异或
|
^
|
|
按位异或: 两个数相同为0,不同为1
逻辑异或: 相同为false,否则为true
|
|
11
|
位运算符: 按位或
逻辑运算符: 逻辑或
|
|
|
|
按位或: 两个都是0,结果为0,否则为1
逻辑或: 左边无论取值真假,右边都会计算
|
|
12
|
逻辑运算符: 短路与
|
&&
|
|
两者是true,结果才是true。左边是false时,右边不会计算。
|
|
13
|
逻辑运算符: 短路或
|
||
|
|
两者是false,结果才是false。左边是true时,右边不会计算。
|
|
14
|
条件运算
|
?:
|
从右向左
|
表达式1 ? 表达式2 : 表达式3
如果表达式1为true,则返回表达式2的值,否则返回表达式3的值
|
|
15
|
赋值运算符: 赋值运算
|
=、+=、-=、*=、/=、%=
|
从右向左
|
|
|
16
|
位赋值运算
|
&=、|=、<<=、>>=、>>>=
|
从右向左
|
|
运算符的结合性
所有的数学运算符都认为是从左到右运算的,Java 语言中大部分运算符也是从左到右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。
当有多中运算符参与运算的时候,先要考虑优先级,有相同优先级的就看结合性以决定运算顺序。
因为这样,所以,如果没有两个相同优先级的运算,就不存在考虑结合性的问题了。
a?b:c?d:e 相当于 a?b:(c?d:e)