![](/img/trans.png)
[英]Why is post increment operator in a return statement act different from expected in Eclipse?
[英]In Java, how does a post increment operator act in a return statement?
给定以下代码,ixAdd会执行您期望的操作,即在增量之前返回ix的值,但在离开函数之前增加类成员吗?
class myCounter {
private int _ix = 1;
public int ixAdd()
{
return _ix++;
}
}
当程序离开函数的堆栈帧(或Java中的任何内容)时,我不太确定post / pre increment的通常规则是否也适用于return语句。
关键部分是在计算表达式后立即发生后递增/递减。 它不仅在返回发生之前发生 - 它发生在任何后续表达式被评估之前。 例如,假设您写道:
class myCounter {
private int _ix = 1;
public int ixAdd()
{
return _ix++ + giveMeZero();
}
public int giveMeZero()
{
System.out.println(_ix);
return 0;
}
}
这也会打印出递增的结果,因为增量发生在giveMeZero()
之前。
那么,让我们看一下字节码(使用javap -c <classname>
自己看看):
Compiled from "PostIncTest.java"
class myCounter extends java.lang.Object{
myCounter();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #2; //Field _ix:I
9: return
public int ixAdd();
Code:
0: aload_0
1: dup
2: getfield #2; //Field _ix:I
5: dup_x1
6: iconst_1
7: iadd
8: putfield #2; //Field _ix:I
11: ireturn
}
如您所见, ixAdd()
指令6和7处理返回前的增量。 因此,正如我们所期望的那样,递减运算符确实在return语句中使用时有效。 但是请注意,在这两个出现之前有一个dup
指令; 递增的值(当然)不会反映在返回值中。
是的,即使在退货声明中,通常的规则也适用于后期增量。 基本上,它在低级别执行的操作是将返回值存储到寄存器中,然后递增类成员,然后从方法返回。
您可以在稍后回答显示字节代码的问题时看到这一点。
是的,它确实。
但是不要这样做,在表情中有副作用是不好的风格。
它确实在递增之前返回值,然后递增_ix。 因此,第一次在myCounter实例上调用方法ixAdd时,它将返回1,第二次返回2,依此类推。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.