【问题标题】:Why is the non-zero return int acting as 0? [closed]为什么非零返回int充当0? [关闭]
【发布时间】:2020-02-20 20:49:40
【问题描述】:

我一直在跟踪这个并且总是发现最后一个答案是 103,但是当我运行程序时,它是 13。返回值没有被添加到methodThree 中的 t.sum。

我已尝试将行修改为

t.sum += methodTwo() + 7;

但答案是一样的。执行此行前后 t.sum 的值为 12。为什么这行t.sum的值不变?

class Test {

    int x = 2;
    int y = 4;
    int sum = 6;
    Test t;

    void methodOne() {
        t = new Test();
        t.sum += sum;
        System.out.println(t.sum);
    }

    int methodTwo() {
        System.out.println(++x);
        methodOne();
        System.out.println(y++);
        return x * y * sum;
    }

    int methodThree() {
        t.sum += methodTwo();
        System.out.println(++t.sum);
        return --sum;
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.methodOne();
        Test t2 = new Test();
        t2.methodOne();
        t2.methodThree();

    }

}

【问题讨论】:

  • 这是使用调试器逐步执行程序的绝佳机会。
  • 您确定您正在关注您在t 上更改的变量、t2 上的哪些变量以及您在this 上更改的哪些变量?因为根本不清楚您要做什么。
  • methodOne 的第一行是t = new Test();,所以每次调用methodOne 时总是丢弃当前的t。为什么Test 包含 Test 的实例?
  • 请注意methodOne(由methodTwo调用)正在创建一个新实例并将其分配给t - 所以t.sum在调用之后是另一个值,然后是之前(结果添加到先前一)....(如何从不编写代码的一个很好的例子)

标签: java class object methods


【解决方案1】:

我同意这很棘手。在methodThree 中戏弄的是t 在调用methodTwo 的过程中被更改。因此,当您在通话前后查看t.sum 时,您查看的不是同一个tt 是如何变化的?当methodTwo 调用methodOne 时会发生这种情况,这又会创建一个新的Test 对象并将其分配给t

在这种情况下,我们还需要了解通常的从左到右评估的含义。 t.sum += methodTwo(); 在某种意义上是从左到右评估的,在另一种意义上是从右到左评估的。我是什么意思? Java 从左边开始,查看t.sum 并由此决定将方法结果添加到哪个sumt 在调用之前引用的对象中的sum。该调用返回 90,它被添加到 old t 对象中。正如我所说,与此同时,已经创建了一个新的 t 对象,其中 sum 为 12。因此,在语句完成后,t.sum 也是 12。

【讨论】:

  • 补充一点,JLS15.26.2. Compound Assignment Operators描述了执行顺序——前2步:“首先,左边的操作数被求值以产生一个变量......”,“左边的值-hand 操作数被保存,然后计算右手操作数..."
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
相关资源
最近更新 更多