【问题标题】:How do I read a loop that has no braces?如何读取没有大括号的循环?
【发布时间】:2012-10-28 02:05:14
【问题描述】:

我正在尝试阅读此代码的输出,但这对我来说根本没有意义。

即使在得知没有大括号的循环只循环第一行之后,输出仍然毫无意义。有些数字可以,但有些数字却没有。

我的代码:

int n = 8;
int i = 1;
int j = 1;

j = n + 2;

System.out.println (n + " " + i + " " + j );

while (n > 1)
{
    n = n/2;
    for (i = 2; i <= n; i = i+2)
        System.out.println (n + " " + i + " " + j );

    j++;
}
System.out.println (n + " " + i + " " + j );

它输出:

8 1 10
4 2 10
4 4 10
2 2 11
1 2 13

我得到了 8-1-10 和 4-2-10

但是在那之后的任何事情,我都很难过,我不明白计算机是如何计算其余部分的。

有人介意和我一起逐步完成剩下的输出吗?

提前致谢。

【问题讨论】:

  • 使用调试器执行代码,一步一步来了解程序的作用。
  • 最好的办法是在每个 System.out 中添加一些额外的文本,而不是精确的复制/粘贴。这为您提供了一些关于正在执行哪个 System.out 的线索。

标签: java for-loop while-loop


【解决方案1】:

没有大括号意味着循环只影响循环之后的下一个语句

所以

for (i = 2; i <= n; i = i+2)
System.out.println (n + " " + i + " " + j );

等价于

for (i = 2; i <= n; i = i+2)
{
    System.out.println (n + " " + i + " " + j );
}

通常,在这些情况下使用缩进来使代码更易于理解,如下所示:

for (i = 2; i <= n; i = i+2)
    System.out.println (n + " " + i + " " + j );

编辑:现在,这是问题的实际答案。这完全取决于循环执行的不同迭代以及变量如何递增。

int n = 8;
int i = 1;
int j = 1;

j = n + 2; //This means that j takes the value 10.

System.out.println (n + " " + i + " " + j ); // 8 1 10 So far, so good.

现在,继续迭代:

while (n > 1)
{
    n = n/2;
    for (i = 2; i <= n; i = i+2)
        System.out.println (n + " " + i + " " + j );

    j++;
}

对于第一次迭代,我们有n=8 i=1 j=10,因此由于n &gt; 0true,循环发生。

n = n / 2; //n = 4

然后,for(注意它只是将值2 分配给i):

for (i = 2; i <= 4; i = i+2) //Since n = 4

由于n = 4i 可以取的值只有24,那么打印出来的是:

4 2 10
4 4 10

之后,j 加一,成为j = 11。再次满足while 的条件是因为n = 4n = n/2 使n 取值2,所以它进入while again。让我们再看一下for:

for (i = 2; i <= 2; i = i+2) //Since n = 2

这一次,i 可以采用的唯一值是 2(请注意,在开始迭代时,i 的值会再次重置为 2),这就是您得到的打印结果。

2 2 11

在再次迭代之前,j++ 使 j 具有值 12

在最后一次迭代中,n = n/2 的结果是 n = 1,因为 n 是一个 int,但这是在 while 内完成的,所以它再次进入。现在n = 1 循环看起来像这样:

for (i = 2; i <= 1; i = i+2) //Since n = 1

i 设置为 2 并且不满足 for 的条件(2 &lt;= 1false)。那么这次没有打印,但是j在while结束时递增到13

在下一次迭代中你有n = 1,这意味着while 的条件不满足所以迭代中断。最后你有n = 1i = 2j = 13。这是你得到的最后一张照片。

【讨论】:

  • “以下代码的语句”。你可以在一行中有很多语句。
  • 感谢@RobertHarvey 的编辑,我实际上添加了相同的内容。
  • OP 在问题中表示他们已经知道这个事实。他们可能还缺少其他东西。
  • 感谢您写下这一切。我现在完全明白了。我很感激。
  • @user996173 不客气,很高兴能为您提供帮助。
【解决方案2】:

您以 n = 8、i = 1 和 j = 10 开始 while 循环。

start while: (n=8 > 1) is true
n = 4
i = 2 (i <= 4, so do for loop, then change i to i+2=4)
print 4,2,10
i = 4 (i <= 4, so do for loop again, then i = i+2 = 6
print 4,4,10
i = 6 (i <= 4 is false, so exit for)
j++ so j becomes 11

next while:
n = n/2 = 2
i = 2 (i <= 2, so do for loop, then change i to i+2=4)
print 2,2,11
i = 4 (i <= 2 is false, so exit for)
j++ -> j = 12

next while:
n = n/2 = 1
i = 2 (i <= 1 is false, so exit loop)
j++ -> j = 13

exit while.
Final print= n = 1, i = 2 (value assigned in last for loop, loop doesn't get executed so i doesnt get incremented by 2), and j = 13

希望这会有所帮助:)

【讨论】:

  • 嘿,我只想非常感谢你写了这篇文章。它帮助我清楚地理解它。你真棒。
猜你喜欢
  • 2017-10-28
  • 2014-05-07
  • 2021-12-29
  • 2013-09-15
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
相关资源
最近更新 更多