【问题标题】: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
    

    相比之下,使用 preincrement7 == ++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 值。这就是为什么我们有两种不同的增量运算符:有时你想使用旧值(后缀运算符),有时你想使用新值(前缀运算符)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-02
        相关资源
        最近更新 更多