各类运算符介绍以及优先级问题
苏轻最后编辑于2018年12月2日15:17:34
算术运算符
- 二元运算符(+、-、*、/、%)
- 二元运算符是指需要两个操作数才能完成运算的运算符。
- “%”是取模运算符,也即是常说的“取余数”。
- 整数运算
- 如果两个操作数至少有一个为long类型,则结果为long类型。
- 只要两个操作数没有long类型,结果就为int类型,即使操作数中有short或byte类型。
- 浮点数运算
- 如果两个操作数至少有一个为double类型,则结果为double类型。
- 只有两个操作数都是float类型,结果才是float类型。
- 取模运算
- 取模运算的操作数可以为浮点数,但是一般都使用整数。
- 结果“余数”的符号和左边的操作数相同。
- 一元运算符(++、–)
int a = 1; // a=1
int b = a++; // 先赋值,在自增 b=a=1 a=a+1=2
int c = ++a; // 先自增,在赋值 a=a+1=3 c=a=3
int d = -7 % 3; // d=-1
int e = 7 % -3; // e=1
赋值运算符
- 赋值运算符就是等号。
-
赋值的扩展运算符如下表所示:
运算符 |
用法 |
等效 |
+= |
a += b; |
a = a + b; |
-= |
a -= b; |
a = a - b; |
*= |
a *= b; |
a = a * b; |
/= |
a /= b; |
a = a / b; |
%= |
a %= b; |
a = a % b; |
int a = 1;
int b = 2;
a += b; // a=a+b=3
a *= b; // a=a*b=6
关系运算符
- ==、!=、>、<、>=、<=
- 关系运算符用来进行比较运算,结果是布尔值(true/false)。
- ==和!=,所有数据类型都可以使用。
- >、<、>=、<=只有数值类型(byte/short/int/long/float/double,还有char)可以使用。
逻辑运算符
- 在Java中,逻辑运算的操作数和运算结果都是boolean类型。
名称 |
符号 |
结果 |
逻辑与 |
& |
如果两个操作数都是true,那么结果为true,否则为false |
逻辑或 |
| |
两个操作数只要有一个是true,结果就为true,否则为false |
短路与 |
&& |
只要有一个为false,就直接返回false结束运算 |
短路或 |
|| |
只要有一个为true,就直接返回true结束运算 |
逻辑非 |
! |
取反 |
逻辑异或 |
^ |
相同为false,不同为true |
- 短路的方式:从左向右计算,如果左边的操作数就已经可以确定该逻辑表达式的值,那么就不会计算右边的操作数,追求高效率。
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.printf("a = %d, b = %d\n", a, b);
boolean f = (a == b) && (++a == b);
// 因为 a == b 为 false,所以 f = false,短路后右边不计算
System.out.printf("f = %b\n", f);
System.out.printf("a = %d, b = %d\n", a, b);
boolean t = (++a == b) && (a == b);
// 因为 ++a 先计算,所以 a = 2
// 发生短路的时候,不会再计算右边部分,某些计算导致的值的改变就不会发生
System.out.printf("t = %b\n", t);
System.out.printf("a = %d, b = %d\n", a, b);
}
位运算符
位运算符 |
说明 |
~ |
取反 |
& |
按位与 |
| |
按位或 |
^ |
按位异或 |
« |
左移运算符,二进制左移相当于乘2 |
» |
右移运算符,二进制右移一位以为相当于除2取商 |
- “&”和“|”既是逻辑运算符,也是位运算符。如果两侧的操作数都是boolean类型,就作为逻辑运算符使用。如果两侧的操作数都是整数类型,就作为位运算符使用。
- 不要把“^”当做幂运算,它是“按位异或”操作。
字符串连接符(+)
- “+”运算符两侧的操作数只要有一个是字符串(String)类型,系统就会自动将另一个操作数转换为字符串然后进行连接。
条件运算符
- 格式:
T ? A : B
- T为boolean类型的表达式,先计算T的值。
- 若T为true,运算结果为表达式A的值,否则为表达式B的值。
运算符的优先级问题
优先级 |
运算符 |
类 |
结合性 |
1 |
() |
括号运算符 |
由左至右 |
2 |
!、+(正)、-(负) |
一元运算符 |
由左至右 |
2 |
~ |
位逻辑运算符 |
由右至左 |
2 |
++、– |
递增与递减运算符 |
由右至左 |
3 |
*、/、% |
算术运算符 |
由左至右 |
4 |
+、- |
算术运算符 |
由左至右 |
5 |
«、» |
位左移、右移运算符 |
由左至右 |
6 |
>、>=、<、<= |
关系运算符 |
由左至右 |
7 |
==、!= |
关系运算符 |
由左至右 |
8 |
& |
位运算符、逻辑运算符 |
由左至右 |
9 |
^ |
位运算符、逻辑运算符 |
由左至右 |
10 |
| |
位运算符、逻辑运算符 |
由左至右 |
11 |
&& |
逻辑运算符 |
由左至右 |
12 |
|| |
逻辑运算符 |
由左至右 |
13 |
? : |
条件运算符 |
由右至左 |
14 |
=、+=、-=、*=、/=、%= |
赋值运算符、扩展运算符 |
由右至左 |
我现在要举一个例子:A || B && C
,看第一眼的时候谁能很清晰地反应过来优先级?它等价于A || (B && C)
,而不是(A || B) && C
!
脑容量不够用的苏轻觉得根本没必要记这么多优先级!既然小括号是最高的优先级,那写表达式的时候就全部用小括号括起来吧!
instanceof 运算符
- instanceof 是二元运算符,左边是对象,右边是类。
- 若左边的对象是右面的类(或右边的类的子类)所创建的对象时,返回 true,否则返回 false。