【问题标题】:How does a for loop iterate through an array?for 循环如何遍历数组?
【发布时间】:2018-09-20 13:31:51
【问题描述】:

我试图了解 for 循环如何实际遍历数组背后的逻辑。以这个例子为例,我将在其中使用 Java:

int[] numbers = {5, 6, 7};

for(int i = 0; i < number.length; i++) {
    System.out.println(numbers[i]);
}

我不明白打印numbers[i] 是如何在数组中循环的。更具体地说,我不明白i 是如何表示数组的内容的。

【问题讨论】:

  • 变量i 只是一个虚拟index,用于表示数组中的位置,因为循环正在评估。如果你仍然不明白这一点,我建议你阅读一个好的 Java/编程教程,并专注于循环的语法。
  • numbers[i] 构造循环遍历数组。 for 循环结构可以。 ifor-loop-scoped 变量,它保存数组的当前索引,上限为&lt; numbers.length,每个周期递增一(i++)。所以numbers[i] 是对索引inumbers 的数组元素的引用。顺便说一句,您的循环声明中有错字 - 应该是 number**s**.length
  • numbers[0]是数组的第一个元素,如果i = 0那么numbers[i]numbers[0]一样,也就是数组的第一个元素。如果现在执行i++i 变为 1,numbers[i] 现在与数组中的第二个元素 numbers[1] 相同

标签: java arrays loops for-loop logic


【解决方案1】:

我将使用稍微不同的类比,因为很多答案都在为您提供正确的信息。

数组只是包含值的连续框的列表。想象它是一个房屋列表,每个房屋的编号从 0(Java 中的数组像许多其他编程语言一样从 0 而不是 1 开始)到 n(在您的情况下是 2)。

因此,如果您是从每个房子收集捐款的人,您将从第一个房子 0 开始,然后前往下一个房子 1,然后到下一个房子 2。您将跟踪您现在正在访问的房子,这样你也知道下一个是哪个,这就是整数变量i在做什么。

打印numbers[i] 不会使循环循环,就像敲第一个房子并不意味着你要敲第二个房子一样。

for 循环跟踪您接下来需要访问的门牌号。它通过它在同一行中的 3 个语句来完成:

for(int i = 0; i &lt; number.length; i++)

第一个语句是从第一所房子开始(int i = 0)。你可以从任何你喜欢的地方开始。

第二个语句是说,你想上到最后一个房子,不管有多少房子。 (i &lt; number.length)。这字面意思是只要i 小于数组的大小就保持循环。你可能会问为什么条件不是&lt;=。因为我们从 0 开始,所以长度(数组的大小)将是最后一个房子的数量 + 1。在你的情况下,length = 2 + 1

第三个陈述,是什么让你搬到下一个房子。 i++i = i + 1 的简写。该语句发生在循环的每次迭代之后。

所以本质上你的 for 循环首先将 i 初始化为 0,检查条件(第二个语句),如果满足条件进行第一次迭代,那么它最终递增 i,如果第二个条件是,则开始另一个迭代还是很满意的。重复此循环,直到您的 for 表达式的第二个语句不再为真。

最后所有numbers[i] 的意思是,由于numbers 是一个数组,[ ] 运算符访问指定索引处的值。所以这就像敲门号码i的房子,看看谁住在那里。将值提供给 System.out.println() 会在屏幕上打印该值。

【讨论】:

    【解决方案2】:

    这里是for循环如何执行的细分(源自this certification study guide

    名称如下:

    for(initialization code; 
        boolean expression; 
        update statements){
      body
    }. 
    

    for 循环的部分按以下顺序执行:

    1. 初始化代码
    2. 如果布尔表达式为真,则执行主体,否则退出循环
    3. 身体执行
    4. 执行更新语句
    5. 返回步骤 2

    因此,当应用于您的示例时,我们可以说:

    运行初始化:

    int i = 0
    

    迭代 1:

    if(i < number.length) // -> if(0 < 3)
    //run body
    i++ //i becomes 1
    //return to step 2 (new iteration)
    

    迭代 2:

    if(i < number.length) // -> if(1 < 3) //i was incremented to 1
    //run body
    i++ //i becomes 2
    //return to step 2 (new iteration)
    

    迭代 3:

    if(i < number.length) // -> if(2 < 3) //i was incremented to 2
    //run body
    i++ //i becomes 3
    

    迭代 4(未运行):

    //return to step 2 (new iteration)
    if(i < number.length) // -> if(3 < 3)  -> condition not met
    //condition not met, stop the loop
    

    更具体地说,我不明白我是如何表示数组的内容的

    如上所示,每次循环体执行完毕,都会执行更新语句,这使得i变量递增,从而允许访问数组的不同索引。

    这是明智的做法,如果您将更新语句更改为i += 2,则将跳过数组的某些索引。

    【讨论】:

      【解决方案3】:

      要访问数组中的信息,我们必须告诉数组我们想访问它的哪一部分。为此,我们使用语法

      array[index]
      

      当您使用 for 循环遍历数组时,您实际上是在使用 array[index] 从第一个元素到最后一个元素。

      for (int i = 0; i < array.length; i++) 
      

      将从 array[0] 开始并被带到 array[lastElement] 打印出数组的每个元素。

      【讨论】:

        【解决方案4】:

        for(int i = 0; i &lt; number.length; i++) 行是你的线索。

        您在此处声明的 for 循环指定了三个参数*:初始化变量、何时继续循环以及每次迭代后要做什么:

        • int i = 0 是初始化变量。它是一个值为 0 的整数,仅存在于 for 循环中。
        • i &lt; number.length 告诉 for 循环它应该继续运行 for 循环内的任何操作,只要这个条件成立。在这种情况下,这意味着只要i 小于numbers 数组的“长度”(或“大小”),它就应该继续运行。也就是说,只要i 小于 3。
        • i++ 告诉 for 循环在每次迭代后要做什么。在这种情况下,您是在告诉 for-loop 将变量 i 增加 1。
        • System.out.println() 是一种将内容打印到终端的方法
        • numbers[i] 描述您想要 numbers 数组中 ith 索引中的任何元素。也就是说,当 i 为 2 时,您希望该元素位于第二个索引中。当i 为 1 时,您希望该元素位于第一个索引中。 重要提示:Java数组是zero-indexed,表示数组中第一个元素的索引为0,第二个元素的索引为1,以此类推。

        在你的循环中发生的事情就是你正在声明一个循环,应该有一个初始值为 0 的整数 i,只要 i 小于 3,它就应该继续运行,它应该在每次运行时将 i 递增 1,并且每次循环运行时,它都应该在 numbers 数组中的 ith 索引处打印元素。

        --

        *'parameter' 可能不是正确的术语。

        【讨论】:

          【解决方案5】:

          数组的值是通过语法取出来的

          numbers[index];
          

          数组索引从 0 开始,然后是 1,然后是 2....所以为了检索您需要的第一个元素

          numbers[0];
          

          与此同时,在 for 循环中,您创建了一个名为 i 的块变量。请注意,在迭代时,i 的值会因i++ 而增加 1。

          所以在你的 for 循环中会发生这种情况。

          numbers [0];
          numbers[1];
          numbers[2];
          

          我认为你不明白for 循环是如何工作的。请阅读,

          根据那篇文章,

          for(initialization; condition ; increment/decrement){
             statement(s);
          }
          

          示例(这不是Java,它是JavaScript,但for循环的工作方式相同;不是不要误会。我只是想告诉你关于i 的值如何递增的工作示例。)

          var i;
          for (i = 0; i < 10; i++) {
            console.log("i = " + i);
          }

          【讨论】:

            【解决方案6】:

            "数组将始终使用连续的存储位置布置在内存中。编译器知道数组从内存单元 x 开始。当它需要到达 a[123] 时,它会将 123 添加到 x 并使用该数字寻址内存以到达元素。”

            它们是连续的,索引从 0 开始。每个新元素都是当前索引的下一个位置。因此,您可以使用他的索引访问数组中的任何元素。

            如果您正在编写numbers[i],则表示数组中的第 i 个元素。并且数组的最高索引总是小于数组的长度(数组的大小)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-04-02
              • 1970-01-01
              • 2015-07-09
              • 1970-01-01
              • 2020-11-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多