🌟 想系统化学习 Java 编程?看看这个:[编程基础] Java · 学习手册
0x01:运算符的优先级 — 概览
在前面的学习中,我们已经掌握了多种运算符的使用方法。可是,当多种运算符同时出现在一个表达式中时,如何确定它们的执行顺序呢?
与数学中的 ”先乘除后加减“ 规则类似,Java 也为所有运算符定义了明确的 优先级体系。 这种优先级决定了不同运算符在混合运算中的执行顺序:
-
高优先级运算符 优先计算(如
()
括号中的内容)。 -
同优先级运算符 按结合方向顺序计算(如多数运算符从左到右,赋值运算符从右到左)。
-
低优先级运算符 最后计算(如
+
法、逻辑运算符)。
Java 中的运算符优先级如下表所示(不用死记,了解即可,实际编程中,以 ()
来包裹你想先计算的内容即可):
优先级 | 运算符 | 说明 | 结合性 |
---|---|---|---|
1 | () | 括号运算符 | 从左至右 |
2 | ! 、+ (正号)、- (负号) | 一元运算符 | 从左至右 |
2 | ~ | 位逻辑运算符 | 从左至右 |
2 | ++ 、-- | 递增与递减运算符 | 从左至右 |
3 | * 、/ 、% | 算数运算符 | 从左至右 |
4 | + 、- | 算数运算符 | 从左至右 |
5 | << 、>> | 位左移、右移运算符 | 从左至右 |
6 | > 、>= 、< 、<= | 关系运算符 | 从左至右 |
7 | == 、!= | 关系运算符 | 从左至右 |
8 | & | 位运算符、逻辑运算符 | 从左至右 |
9 | ^ | 位运算符、逻辑运算符 | 从左至右 |
10 | | | 位运算符、逻辑运算符 | 从左至右 |
11 | && | 逻辑运算符 | 从左至右 |
12 | || | 逻辑运算符 | 从左至右 |
13 | ? : | 条件运算符 | 从右至左 |
14 | = 、+= 、-= 、*= 、/= 、%= | 赋值运算符、扩展赋值运算符 | 从右至左 |
0x02:运算符的优先级 — 演示
实战中我们不用记忆那么多的优先级,不确定优先级的拿小括号括起来即可。不过为了内容的完整性,笔者决定还是举一个小小的例子来看一下优先级的影响,看下面这个算式,问结果是多少:
int num1 = 1;
boolean result; // 用来存放最终的计算结果
result = ++num1 + 2 * num1-- >= 3 && 1 + 3 * 2 == 8 || num1++ <= 1;
上面这个算式看着就烦,我们先找出优先级最高的进行一轮简化,对照表格,优先计算 ”递增与递减“,简化后的 1.0 为(笔者直接拿数字做代替了):
result = 2 + 2 * 2 >= 3 && 1 + 3 * 2 == 8 || 1 <= 1;
继续,发现表达式中的 *
法优先级最高,简化后的 2.0 如下:
result = 2 + 4 >= 3 && 1 + 6 == 8 || 1 <= 1;
继续,发现算数运算符 +
法优先级最高,简化后的 3.0 如下:
result = 6 >= 3 && 7 == 8 || 1 <= 1;
继续,发现关系运算符 >=
& <=
优先级最高,简化后的 4.0 如下:
result = true && 7 == 8 || true;
继续,发现关系运算符 ==
优先级最高,简化后的 5.0 如下:
result = true && false || true;
继续,发现关系运算符 &&
优先级最高,简化后的 6.0 如下:
result = false || true;
所以,最终结果为 true
。代码示例如下:
public class TestVar {
public static void main(String[] args) {
int num1 = 1;
boolean result; // 用来存放最终的计算结果
result = ++num1 + 2 * num1-- >= 3 && 1 + 3 * 2 == 8;
System.out.println(result);
}
}