为什么我跟踪代码时走的路线是错误的?

Why is the route I'm taking while tracing the code wrong?

我应该为我的 class 追踪这段代码,但无论我经历多少次,我似乎都得到了错误的答案。

下面的代码让我跟踪它并找到输出。我采取的路线是,一旦我点击一个(推文)我就直接跳到它,然后继续它之后的 for 循环。

我得到答案

Index0:a is -4 b is 1

Index0:a is 14 b is -5

Index0:a is 16 b is 1

c is 6

public class Tweet
{
   private int a;
   private int b;
   public static int c = 0;

   public Tweet(int a, int b)
   {
      this.a = a;
      this.b = b;
      c += this.a + this.b;
   }

   public int getA()
   {
      return this.a;
   }

   public int getB()
   {
      return this.b;
   }

   public void setA(int a)
   {
      this.a = a;
   }

   public void setB(int b)
   {
      this.b = b;
   }
}

public class Homework4
{
   public static void main(String[] args)
   {
      Tweet t1 = new Tweet(3, 8);
      Tweet t2 = new Tweet(-3, 7);
      Tweet[] tweets = { t1, t2, new Tweet(0, -5) };
      one(tweets);
      for (int i = 0; i < tweets.length; i++)
      {
         System.out.print("Index 0: ");
         System.out.print("a is " + tweets[i].getA());
         System.out.println(" b is " + tweets[i].getB());
      }
      System.out.println("c is " + Tweet.c);
   }
   public static void one(Tweet[] tws)
   {
      for (int i = 0; i < tws.length - 1; i++)
      {
         Tweet w = tws[i];
         Tweet x = tws[i + 1];
         w.setA(2 * x.getB());
         w.setB(-2 + x.getA());
      }
      tws[2] = tws[0];
      tws[0].setA(-4);
   }
}

这是我第一次在这里发帖,所以如果需要更多信息,请告诉我,我只需要知道我在这里做错了什么。

tweets 数组中有三个条目,您的代码为每个条目打印出 "Index 0: ",因此您自然会得到三行,然后是最后的 "c is " 条目。您确实访问了每个元素,而不仅仅是跳转到一个元素。

我想混淆是因为没有更新数组中的索引,也就是说,你可能打算让 System.out.print("Index " + i + ": "); 像往常一样,过多的日志记录既可以混淆也可以澄清!

那么至少你会得到:

Index 0:a is -4 b is 1

Index 1:a is 14 b is -5

Index 2:a is 16 b is 1

c is 6

(这些值是否正确是另一回事!)

我不清楚你错在哪里,所以让我们从上往下看。为了简洁起见,我将使用符号 Tweet(a,b)

创建了三个推文并将其放入一个数组中。由于cTweet的静态字段,所以我单独表示:

c = 0
t[0] = Tweet(3, 8),  c = 11
t[1] = Tweet(-3, 7), c = 11 + 4 = 15
t[2] = Tweet(0, -5), c = 15 - 5 = 10

调用函数one(Tweet[])

w = t[0], x = t[1]
w = Tweet(2 * x.getB(), -2 + x.getA())
  = Tweet(14, -5)

w = t[0], x = t[1]
w = Tweet(2 * x.getB(), -2 + x.getA())
  = Tweet(-10, -2)

t[2] = t[0] // the value of t2 is, effectively, discarded

t[0] = Tweet(-4, -5)
t[1] = Tweet(-10, -2)
t[2] = t[0] = Tweet(-4, -5)

因此,使用 Andrew Regan 在他的回答中描述的格式,输出应该是:

Index 0: a is -4 b is -5
Index 1: a is -10 b is -2
Index 2: a is -4 b is -5
c is 10

如果您在跟踪代码块时遇到问题,一些很棒的工具是:

  • 任何优秀的调试器都可以选择逐步执行代码和添加断点。如果您手动调用 javajavac,您应该已经拥有 jdb available to you. IntelliJ,以及任何其他 IDE 都将内置调试器。
  • 另一个很好的资源(特别是对于较小的程序)是 Java Visualizer,可在此处获得:http://cscircles.cemc.uwaterloo.ca/java_visualize