在 Java 中,后增量运算符如何在 return 语句中起作用?

2022-09-03 08:56:00

给定以下代码,ixAdd 是否会执行您期望的操作,即在增量之前返回 ix 的值,但在离开函数之前递增类成员?

class myCounter {
    private int _ix = 1;

    public int ixAdd()
    {
        return _ix++;
    }
}

我不太确定当程序离开函数的堆栈帧(或Java中的任何内容)时,post/pre增量的通常规则是否也适用于 return 语句。


答案 1

关键部分是,在计算表达式后立即发生后递增/递减。它不仅发生在返回发生之前 - 它发生在任何以后的表达式被计算之前。例如,假设您写道:

class myCounter {
    private int _ix = 1;

    public int ixAdd()
    {
        return _ix++ + giveMeZero();
    }

    public int giveMeZero()
    {
        System.out.println(_ix);
        return 0;
    }
}

这也会打印出递增的结果,因为递增发生在调用之前。giveMeZero()


答案 2

好吧,让我们看看字节码(用来自己看):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

}

如您所见,中的指令 6 和 7 在返回之前处理增量。因此,正如我们所期望的那样,递减运算符在 return 语句中使用时确实会产生影响。但是,请注意,在这两个出现之前有一个指令;递增的值(当然)不会反映在返回值中。ixAdd()dup