3
public class TestReturn {
     int i = 0;

    public static void main(String[] args) {
        TestReturn t = new TestReturn();

        System.out.println(t.test());
        System.out.println(t.i);
    }

    private int test() {
            return i++;
    }
}

输出

0
1

我的问题是,

  1. 由于 test() 的返回值为 0,即未递增,所以当我打印 i 时为什么要递增。我所知道的是,return是方法的退出点,但是从这个方法中我发现从方法返回后发生了一些事情。

那么 return 究竟是如何工作的呢?

4

4 回答 4

7

简单的。

当你做return i++ i的时候最初是0。i++被称为增量,正如它的名字所说,i将在之后增量。

尽管在递增之前i++返回一个值,但该方法在返回. return 不会突然中途停止此语句(评估但不递增)main

因此,您将返回 0,将其递增,然后在调用System.out.println(t.i);.


从技术上讲, 的值i存储到堆栈中,类字段递增,然后i返回复制出的值。

于 2013-11-11T12:14:19.447 回答
1

这里的问题不是返回,而是您对后增量运算符的使用。

“return i++;”会发生什么?是返回 i 的值,然后增加值。这就是为什么你得到 0 和 1 作为值。

于 2013-11-11T12:14:40.297 回答
0

如果你想回来1,给return ++i;

return i++;将首先返回i,然后增加它;

i++可以想象成另外一个函数之类的(语法不适用于java strong)——

preIncrementFunction(int &i){
   int j = *i;
   *i = *i+1;
   return j;
}

因此,打印的值是未增加的值,i但值i已更改。

于 2013-11-11T12:20:33.917 回答
0

执行语句的动作顺序return i++;如下。

  1. 评估表达式i++

    一种。取值i

    湾。增加变量。

  2. 返回步骤 1 生成的表达式的值。

表达式的计算在方法调用内完成(包括增量)......在调用返回之前。

由于 test() 的返回值为 0,即未递增,所以当我打印 i 时为什么要递增。

从我上面的解释中可以看出,这是因为i作为表达式评估的一部分而递增;步骤 1b。

于 2013-11-11T12:24:11.387 回答