+= 覆盖的函数增量

Increment in function overwritten by +=

在三元运算符中调用的方法会增加一个变量和 returns 一个布尔值。当函数 returns false 时,值被还原。我希望变量为 1,但得到的却是 0。为什么?

public class Main {
    public int a=0;//variable whose value is to be increased in function
    boolean function(){
        a++;
        return false;
    }
    public static void main(String argv[]){
        Main m=new Main();
        m.a+=(m.function()?1:0);
        System.out.println(m.a);//expected output to be 1 but got a 0 !!!!!
    }
}

您在一次调用中对 m.a 进行了两项操作;在 main

m.a += (m.function()?1:0);

a 的值压入框架,然后调用 m.function()(returns false),因此三元扩展为 m.a += 0; (帧中 m.a 的值被添加到 0 并存储在 m.a 中)。因此,该值在 m.function() 中递增(然后在 mainreset)。这样考虑,

m.a = m.a + (m.function() ? 1 : 0);

m.a 的值在 m.function() 的评估之前确定(因此它是一个 post 增量操作)。对于您预期的结果,您可以

m.a = (m.function() ? 1 : 0) + m.a;

基本m.a += (m.function() ? 1 : 0)编译成

 int t = m.a; // t=0 (bytecode GETFIELD)
 int r = m.function() ? 1  : 0; // r = 0 (INVOKEVIRTURAL and, IIRC, do a conditional jump)
 int f = t + r; // f = 0 (IADD)
 m.a = f // whatever m.a was before, now it is 0 (PUTFIELD)

以上行为均在JLS 15.26.2 (JAVA SE 8 edition)

中指定