代码之家  ›  专栏  ›  技术社区  ›  e2rabi

对java运算符优先级计算结果感到困惑

  •  3
  • e2rabi  · 技术社区  · 6 年前

    我有一个表达式,我对它的计算结果感到困惑

    int a = 7;
    boolean res = a++ == 7 || a++ == 9;
    System.out.println("a = " + a);
    System.out.println("res = " + res);
    

    a = 8
    res = true
    

    我不明白为什么a的值是8,我希望a=9,有人能解释一下它是怎么计算的吗?

    4 回复  |  直到 6 年前
        1
  •  3
  •   Pochmurnik SK Developers    6 年前

    这里使用惰性求值。在替代方法中,只有一个操作数(参数)需要为true才能使替代结果为true。左参数在这种情况下为真(因为您使用后增量, a 将在检查后递增),因此无需检查备选方案的左侧。

    这意味着不会执行第二次增量。

        2
  •  3
  •   forpas    6 年前

    boolean res = a++ == 7 || a++ == 9;
    

    评估从这里开始:

    a++ == 7
    

    它实际上被翻译成: a == 7 然后 a = a + 1
    a==7 评估为 true 然后 a 等于 8 .
    真的 ,
    因为短路评估 || (修订) OR
    a++ == 9
    这意味着 A. 不会再次递增。
    如果您想测试您对此概念的理解,请进行以下更改:

    boolean res = ++a == 7 || a++ == 9;
    

        3
  •  1
  •   Ollebrush    6 年前

    当在变量(a++而不是++a)之后写入时,++运算符实际上会在执行语句后更改变量值。所以res变为true,因为a==7,之后a的值变为8

        4
  •  1
  •   Youcef LAIDANI    6 年前

    让我们一步一步地分析发生了什么:

    int a = 7;
    boolean res = 
                   a++ == 7               // a in this step is equal to 7 not 8
                             || a++ == 9; // even in this step, when the statement is end
                                          // a it will incremented to 8
    

    那么第一个声明 a++ == 7 这是真的,因为你得到了 res => true a => 8

    欲知更多详情,请阅读本文 Difference between i++ and ++i in a loop?