函数的增量被+ =覆盖

时间:2016-05-21 04:33:31

标签: java variable-assignment increment ternary

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

2 个答案:

答案 0 :(得分:23)

基本上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)

中指定

答案 1 :(得分:19)

您在一次通话中对m.a进行了两次操作;在main

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

在框架上推送a的值,然后调用m.function()(返回false),因此三元扩展为m.a += 0;(以及{的值来自框架的{1}}已添加到m.a并存储在0中)。因此,该值在m.a中递增(然后在m.function()重置)。以这种方式考虑,

main

m.a = m.a + (m.function() ? 1 : 0); 的值在评估m.a之前确定(因此它是后增量操作)。对于期望的结果,您可以执行

m.function()