给定以下代码,ixAdd会执行您期望的操作,即在增量之前返回ix的值,但在离开函数之前增加类成员吗?
class myCounter {
private int _ix = 1;
public int ixAdd()
{
return _ix++;
}
}
Run Code Online (Sandbox Code Playgroud)
当程序离开函数的堆栈帧(或Java中的任何内容)时,我不太确定post/pre increment的通常规则是否也适用于return语句.
Jon*_*eet 26
关键部分是在计算表达式后立即发生后递增/递减.它不仅在返回发生之前发生 - 它发生在任何后续表达式被评估之前.例如,假设您写道:
class myCounter {
private int _ix = 1;
public int ixAdd()
{
return _ix++ + giveMeZero();
}
public int giveMeZero()
{
System.out.println(_ix);
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
这也会打印出递增的结果,因为增量发生在giveMeZero()
调用之前.
Mic*_*ers 16
好吧,让我们看看字节码(用于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
}
Run Code Online (Sandbox Code Playgroud)
如您所见,指令6和7 ixAdd()
处理返回前的增量.因此,正如我们所期望的那样,递减运算符确实在return语句中使用时有效.但是请注意,dup
在这两个出现之前有一条指令; 递增的值(当然)不会反映在返回值中.
归档时间: |
|
查看次数: |
10160 次 |
最近记录: |