由 += 覆盖的函数增量

在三元运算符中调用的方法递增变量并返回布尔值。当函数返回 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 !!!!!
    }
}

答案 1

基本上编译成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 版)中均已指定


答案 2

您在一次调用中操作了两个操作;在m.amain

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

在帧上推送 的值,然后调用(返回 ),因此三元扩展到(并且从帧的值被添加到并存储在 中)。因此,该值在 中递增(然后在 中重置)。这样想吧,am.function()falsem.a += 0;m.a0m.am.function()main

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

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

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