【问题标题】:Why does == have higher precedence than postfix ++ in Java?为什么 == 在 Java 中比后缀 ++ 具有更高的优先级?
【发布时间】:2021-04-16 22:57:03
【问题描述】:
请,有人可以帮我弄清楚为什么平等在后缀之前具有更高的优先级吗?
int x = 6;
System.out.println(7 == x++);
输出:false
根据Java中运算符优先级的一些来源:后缀应该比相等运算符具有更高的优先级。在这些资料中还提到了运算符的关联性(但它应该在表达式中运算符的优先级相同时出现)。
【问题讨论】:
标签:
java
equality
operator-precedence
post-increment
associativity
【解决方案1】:
正如名称 postincrement 所暗示的,增量发生在分配之后。因此,7 == ++x 被评估为
7 == x
x = x + 1
相比之下,使用 preincrement,7 == ++x 被评估为
x = x + 1
7 == x
演示:
public class Main {
public static void main(String[] args) {
int x = 6;
System.out.println(7 == ++x);
}
}
输出:
true
【解决方案2】:
如果相等的优先级高于后缀增量的优先级,则7 == x++ 将被解析为(7 == x)++。这肯定不是正在发生的事情,因为++ 不能应用于布尔值,而这正是7 == x 会产生的结果。它也不能应用于不是变量的表达式。因此,表达式被解析为就像写成7 == (x++) 一样肯定是这种情况;后缀运算符具有更高的优先级。
让您感到困惑的是,比较的结果是错误的,但这是意料之中的。这也是意料之中的,因为后缀增量 (x++) 的值是变量 before 增加的值。 x肯定是递增的,在相等比较之前就递增了,但是比较的不是7和x的值。它介于 7 和 x++ 返回的值之间,即 6(x 的旧值)。
如果您使用前缀增量运算符编写了7 == ++x,那么它会按预期工作,因为前缀增量运算符返回变量的new 值。这就是为什么我们有两种不同的增量运算符:有时你想使用旧值(后缀运算符),有时你想使用新值(前缀运算符)。