2017-02-18 40 views
-3

我无法跟踪一些代码来获取输出:For循环跟踪问题:无法自圆其说输出

int[] a = new int[5]; 
for (int i = 0; i < a.length; i++) 
{ 
    a[i] = i*3-1; 
} 


for (int i = a.length-1; i >= 0; i--) 
{ 
    System.out.print(a[i] + " "); 
} 

此输出:

11 8 5 2 -1 

我不明白的是为什么第二个变量'i'从第一个For循环中回到公式中。有人可以帮我连接这两个循环?数组在第一个循环中定义,那为什么会影响第二个?我不明白这种关系,也许我只是想念它。

+0

“为什么第二个变量‘我’被放回公式中从第一个for循环”你是什么意思?你期望的输出是什么? – tkausl

+0

第一个循环将数组填充为包含'[-1,2,5,8,11]'。第二个循环只是向后打印。 –

+0

第一个循环显然是填充数组。第二个循环显示创建的数组,但它从最高索引(4)到最低索引(0)。变量** i **仅仅保存要处理的数组元素的当前索引号。 – DevilsHnd

回答

0
for (int i = 0; i < a.length; i++) { 
    a[i] = i*3-1; 
} 

在第一环路(上文),i是循环,这是我想你理解增量器。知道这一点,我们知道整个循环中的i的值将是0, 1, 2, 3, and 4

对于语句a[i] = i * 3 - 1,它有两个目的。

  1. 一个索引值,用于访问修改a数组中的值。使用i的递增值计算新的整数。

例如,在第一次迭代中,i将是0。因此,循环内的代码将数组的位置0的值设置为0 * 3 - 1-1。这在循环的其余部分继续,解释由第二个循环打印的值在反向打印时的值。

0

我不明白为什么第二个变量'我'从第一个For循环被放回到公式中。

i只是变量的名称。在计算值时,变量i并不重要,它仅用作循环计数器。您可以在任何for循环中使用j或任何其他名称,并且仍将获得相同的输出。

有人可以帮我连接这两个循环吗?该数组在第一个循环中定义在 中,那为什么它会影响第二个?

该数组在第一个循环中填充了值。但请注意,数组最初是在程序开始时声明的。

int[] a = new int[5]; 

这意味着该数组的范围不仅限于第一个for循环。它可以在其范围内的任何地方访问。

因此,在第一个for循环中,我们使用值填充数组。在第二个for循环中,我们正在显示它。

+0

数组可能会在第一个循环中填充,但它没有在那里定义。 – pvg

+0

通过'定义'我的意思是填充值,而不是'声明'。请检查[this](https://stackoverflow.com/questions/11715485/what-is-the-difference-between-declaration-and-definition-in-java)SO问题。 – Nikhil

+0

我读过它了。它没有描述你所说的'定义'。如果有什么“int new [5]”可以说是'定义',尽管这不是JLS使用的术语。无论哪种方式,'define'不是一个好词,用于'将东西放入循环中的数组' – pvg

0

'i'的范围在循环内,因此一旦循环结束,变量'i'不再存在并且可以被重新实例化。要了解一下这个代码:

public class Example{ 
    public static void main(String args[]){ 
     while(isTrue){ 
      int x += 3; // Int x exists here 
     } 
     //x does not exist here it is outside of scope so we can make another 
     int x = 10; 
    } 
} 

Var Scope