给定以下代码,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
自己查看):
Compiled from "PostIncTest.java" class myCounter extends java.lang.Object{ myCounter(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()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 }
如您所见,指令6和7 ixAdd()
处理返回前的增量.因此,正如我们所期望的那样,递减运算符确实在return语句中使用时有效.但是请注意,dup
在这两个出现之前有一条指令; 递增的值(当然)不会反映在返回值中.