Java 的运算符分这几类:算术、关系、逻辑、位、赋值、三元。下面逐个看,每个都带可运行的例子。

1. 算术运算符

+ - * / %(加、减、乘、除、取余)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ArithmeticDemo {
public static void main(String[] args) {
int a = 10;
int b = 3;

System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3 整数相除,结果仍是整数(小数被截断)
System.out.println(a % b); // 1 取余:10 除以 3 余 1

// 想得到小数,把其中一个数转成 double
System.out.println(a / (double) b); // 3.3333333333333335
}
}

注意:两个整数相除,小数部分会被直接截断(不是四舍五入)。

2. 自增自减

++ 自增、-- 自减。分前缀和后缀,区别是先加还是先用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class IncrementDemo {
public static void main(String[] args) {
int i = 5;

int x = i++; // 后缀:先把 5 赋给 x,i 再加 1
System.out.println("x = " + x); // x = 5
System.out.println("i = " + i); // i = 6

int y = ++i; // 前缀:i 先加 1 变成 7,再赋给 y
System.out.println("y = " + y); // y = 7
System.out.println("i = " + i); // i = 7

// -- 同理
int z = i--; // z = 7, i = 6
System.out.println("z = " + z + ", i = " + i);
}
}

口诀:符号在前,先加后用;符号在后,先用后加。

3. 关系运算符

> < >= <= == !=,结果是 boolean。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class RelationalDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;

System.out.println(a > b); // false
System.out.println(a < b); // true
System.out.println(a >= b); // false
System.out.println(a <= b); // true
System.out.println(a == b); // false
System.out.println(a != b); // true
}
}

4. 逻辑运算符

&& 与、|| 或、! 非。它们都有短路特性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class LogicDemo {
public static void main(String[] args) {
boolean t = true;
boolean f = false;

System.out.println(t && f); // false 两边都为 true 才为 true
System.out.println(t || f); // true 一边为 true 就为 true
System.out.println(!t); // false 取反

// 短路示例:&& 左边为 false 时,右边不会执行
int a = 0;
boolean result = (a != 0) && (10 / a > 1);
// 因为 a != 0 是 false,右边的 10/a(除零)根本不会执行,所以不会报错
System.out.println(result); // false

// 短路示例:|| 左边为 true 时,右边不会执行
boolean result2 = (a == 0) || (10 / a > 1);
System.out.println(result2); // true
}
}

&& 和 || 会短路;单个 & 和 | 不会短路(属于位运算,见下)。

5. 位运算符

& | ^ ~ << >>,直接操作二进制位,初学了解即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BitDemo {
public static void main(String[] args) {
int a = 5; // 二进制 0101
int b = 3; // 二进制 0011

System.out.println(a & b); // 1 0001 按位与
System.out.println(a | b); // 7 0111 按位或
System.out.println(a ^ b); // 6 0110 按位异或
System.out.println(~a); // -6 按位取反

System.out.println(a << 1); // 10 左移一位,相当于乘以 2
System.out.println(a >> 1); // 2 右移一位,相当于除以 2
}
}

6. 赋值与复合赋值

= 赋值,+= -= *= /= %= 复合赋值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class AssignDemo {
public static void main(String[] args) {
int a = 10;
a += 5; // 等价于 a = a + 5
System.out.println(a); // 15

a -= 3; // a = a - 3
System.out.println(a); // 12

a *= 2; // a = a * 2
System.out.println(a); // 24

a /= 4; // a = a / 4
System.out.println(a); // 6

a %= 4; // a = a % 4
System.out.println(a); // 2
}
}

7. 三元运算符

条件 ? 值1 : 值2,条件为 true 取 值1,否则取 值2。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class TernaryDemo {
public static void main(String[] args) {
int score = 85;
String level = score >= 60 ? "及格" : "不及格";
System.out.println(level); // 及格

// 求两个数的较大值
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max); // 20
}
}

8. 运算符优先级

优先级从高到低大致是:() → 一元(++ -- ! ~)→ 算术(* / % 高于 + -)→ 关系 → 逻辑(&& 高于 ||)→ 三元 → 赋值。

1
2
3
4
5
6
7
8
9
public class PrecedenceDemo {
public static void main(String[] args) {
int a = 2 + 3 * 4; // 先乘除后加减:14
System.out.println(a);

int b = (2 + 3) * 4; // 加括号改变顺序:20
System.out.println(b);
}
}

记不住优先级没关系,加括号就行——括号永远最清楚,别人也更好读。

小结

  • 整数相除会截断小数,要小数就转 double
  • ++i 先加后用,i++ 先用后加
  • && || 有短路特性,能避免不必要的计算(甚至除零错误)
  • 优先级拿不准就加括号