【问题标题】:What happen in method after return statementreturn 语句后方法中发生了什么
【发布时间】:2013-11-23 05:43:26
【问题描述】:
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 究竟是如何工作的呢?

【问题讨论】:

    标签: java variables return


    【解决方案1】:

    简单。

    当您执行return i++ 时,i 最初为 0。i++ 称为 post-increment,正如其名称所说,i 将在 之后递增em>。

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

    所以你会返回 0,增加它,然后在调用 System.out.println(t.i); 时看到 1。


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

    【讨论】:

    • 那么,i++ 的执行不是方法栈的一部分吗?
    • @Gaurav i 的增量是在函数内部和执行过程中完成的,但是返回的值还没有增加。
    • @GauravGupta 看看this。如您所见,它将返回值存储到寄存器中,增加名为i 的字段,然后从该寄存器返回。
    • +1 用于指向链接。这是我想知道的一点。接受你的回答。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      1. 计算表达式i++

        一个。取i的值

        b.增加变量。

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        return i++; 会先返回i,然后递增;

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

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

        所以,打印出来的值是 i 的未递增值,但 i 的值已经改变。

        【讨论】:

        • 再次在我的脑海中产生了同样的问题,i++ 的执行是否不会发生在方法的堆栈中。 AFAIK,方法的堆栈在 return 语句后被销毁。但是既然i++是在方法返回之后执行的,那么i++肯定是在别的地方执行的,那somewhere是什么。
        • 是的return 将终止stack。这就是++ 运算符的工作原理,这里i++return 完全执行之前实现,但返回的值是i 的先前值,因为++ 给出为i++++i。如需更多可视化,请参阅编辑。
        • 在 ++i 的情况下,我们将从 return 语句中获得递增的值,但是,对于其余部分,您是正确的。
        猜你喜欢
        • 1970-01-01
        • 2013-08-17
        • 2014-12-22
        • 1970-01-01
        • 2019-09-16
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        • 2016-01-24
        相关资源
        最近更新 更多