+= 覆盖的函数增量
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()
中递增(然后在 main
中 reset)。这样考虑,
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)
中指定
在三元运算符中调用的方法会增加一个变量和 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()
中递增(然后在 main
中 reset)。这样考虑,
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)
中指定