为什么我跟踪代码时走的路线是错误的?
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)
。
创建了三个推文并将其放入一个数组中。由于c
是Tweet
的静态字段,所以我单独表示:
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
如果您在跟踪代码块时遇到问题,一些很棒的工具是:
- 任何优秀的调试器都可以选择逐步执行代码和添加断点。如果您手动调用
java
和 javac
,您应该已经拥有 jdb
available to you. IntelliJ,以及任何其他 IDE 都将内置调试器。
- 另一个很好的资源(特别是对于较小的程序)是 Java Visualizer,可在此处获得:http://cscircles.cemc.uwaterloo.ca/java_visualize
我应该为我的 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)
。
创建了三个推文并将其放入一个数组中。由于c
是Tweet
的静态字段,所以我单独表示:
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
如果您在跟踪代码块时遇到问题,一些很棒的工具是:
- 任何优秀的调试器都可以选择逐步执行代码和添加断点。如果您手动调用
java
和javac
,您应该已经拥有jdb
available to you. IntelliJ,以及任何其他 IDE 都将内置调试器。 - 另一个很好的资源(特别是对于较小的程序)是 Java Visualizer,可在此处获得:http://cscircles.cemc.uwaterloo.ca/java_visualize