【问题标题】:Need help understanding the syntax in an array需要帮助理解数组中的语法
【发布时间】:2017-12-01 22:26:24
【问题描述】:

我无法理解 for 循环在做什么。

对我来说,我认为它是:

int i = 0; //Declaring i to become 0. i is the value in myArray?

i < myArray.Length; //When i is less than any value in myArray keep looping?

i++; //Every time this loop goes through increase i by 1?

//Making an array called myArray that contains 20,5,7,2,55
int[] myArray = { 20, 5, 7, 2, 55 };

//Using the built in feature, Array.Sort(); to sort out myArray
Array.Sort(myArray);


for (int i = 0; i < myArray.Length; i++)
{
    Console.WriteLine(myArray[i]);
}

【问题讨论】:

  • C# for loop tutorial 上进行谷歌搜索并开始阅读.. 我会先从那里开始.. 它非常简单易读
  • i
  • 现在试试这个:for (int i = myArray.Length-1; i &gt;= 0; i--) Console.WriteLine(myArray[i]);

标签: c# arrays for-loop


【解决方案1】:

我将对你的编程知识做一些假设,如果这个解释涵盖了你已经熟悉的主题,请原谅我,但它们对于理解 for 循环的作用、它的用途和当有人在你身后阅读你的代码时,语义将是什么。您的问题表明您非常接近理解它,所以希望一旦您有一个好的解释,它会像一吨砖一样打击您。

考虑一个长度为 5 的字符串数组。您可以像这样在 C# 中初始化它:

string[] arr = new string[5];

这意味着您有一个为字符串分配了 5 个插槽的数组。这些插槽的名称是数组的 indexes。不幸的是,对于像您这样的编程新手来说,索引从 0 开始(这称为零索引)而不是 1。这意味着我们的新 string[] 中的第一个插槽具有名称或 index 为 0,第二个为 1,第三个为 3,依此类推。这意味着数组的长度总是等于最后一个槽的索引加一;换句话说,因为数组是 0 索引并且第一个(第一个)插槽的索引是 0,我们知道任何给定插槽的索引是 n - 1 其中n 是不是程序员(或初出茅庐的程序员)的人!) 通常会认为是该插槽在整个数组中的位置。

我们可以使用索引从对应索引的槽中的数组中挑选出值。使用您的示例:

int[] myArray = { 20, 5, 7, 2, 55 };

bool first = myArray[0] == 20: //=> true
bool second = myArray[1] == 5; //=> true
bool third = myArray[2] == 7; //=> true
// and so on...

所以你看到我们传递给indexer (MSDN)(方括号[])的数字对应于我们试图访问的数组中的位置。

for C 语法语言中的循环(C# 是其中之一,还有 C、C++、Java、JavaScript 和其他几种语言)通常遵循相同的“参数”约定:

for (index_initializer; condition; index_incrementer)

要了解这些字段的预期用途,了解什么是索引很重要。索引可以被认为是数组中每个槽的名称或位置(或列表或任何类似列表的)。

所以,为了解释 for 循环的每个部分,让我们一一解释:

索引初始化器

因为我们要使用索引来访问数组中的槽,所以我们需要将它初始化为 for 循环的起始值。 for 循环语句中第一个分号之前的所有内容都将在 for 循环中的其他任何内容运行之前运行一次。我们将这里初始化的变量称为 index,因为它在 for 循环的生命周期内跟踪 我们所在的当前索引。使用拉丁字母的后续字母将此变量命名为i 用于嵌套循环的索引是典型的(因此也是很好的做法)。就像我说的,这个初始化语句只发生一次,所以我们将 0 分配给 i 以表示我们要开始循环数组的第一个元素。

条件

声明 for 循环时发生的下一件事是检查条件。此检查将是每次循环运行时运行的第一件事,如果检查返回false,则循环将立即停止。这个条件可以是任何东西,只要它产生bool。如果你有一个特别复杂的 for 循环,你可以将条件委托给方法调用:

for (int i = 0; ShouldContinueLooping(i); i++)

在您的示例中,我们正在检查数组的长度。从惯用的角度来看,我们在这里所说的(以及大多数人在将其视为条件时所期望的)是您将对数组的每个元素执行某些操作。只要我们的i 在数组的“边界”内,我们只想继续循环,该数组始终定义为0 through length - 1。还记得数组的最后一个索引如何等于它的长度减 1 吗?这在这里很重要,因为此条件为假的第一次时间(即,i小于长度)是它等于数组的长度,因此比最终插槽的索引大 1。我们需要停止循环,因为 for 语句的下一部分i 增加一个,这会导致我们尝试访问数组边界之外的索引。

索引增量器

for 循环的最后部分作为每次循环运行时发生的 last 事件执行一次。您对此部分的评论是正确的。

回顾一下事情发生的顺序:

  1. 索引初始化器
  2. 条件检查(如果检查返回false,则“突破”或停止循环)
  3. 循环体
  4. 索引增量器
  5. 从第 2 步开始重复

为了使这一点更清楚,这是您的示例,并添加了一些小内容以使事情更加明确:

// Making an array called myArray that contains 20,5,7,2,55
int[] myArray = { 20, 5, 7, 2, 55 };

// Using the built in feature, Array.Sort(); to sort out myArray
Array.Sort(myArray);
// Array is now [2, 5, 7, 20, 55]

for (int i = 0; i < myArray.Length; i++)
{
    int currentNumber = myArray[i];
    Console.WriteLine($"Index {i}; Current number {currentNumber}");
}

运行它的输出将是:

Index 0; Current number 2
Index 1; Current number 5
Index 2; Current number 7
Index 3; Current number 20
Index 4; Current number 55

【讨论】:

    【解决方案2】:

    我无法理解 for 循环在做什么。

    那我们退一步吧。

    当你看到

    for (int i = 0; i < myArray.Length; i++)
    {
        Console.WriteLine(myArray[i]);
    }
    

    你应该在心里想的是:

    int i = 0;
    while (i < myArray.Length)
    {
        Console.WriteLine(myArray[i]);
        i++;
    }
    

    现在我们用while 重写了for,这样更简单。

    当然,这需要你理解“while”。我们可以再次理解while,将其分解为更简单的东西。当你看到while时,想:

    int i = 0;
    START:
    if (i < myArray.Length)
      goto BODY;
    else
      goto END;
    BODY:
    Console.WriteLine(myArray[i]);
    i++;
    goto START;
    END:
    // the rest of your program here.
    

    现在我们已将您的循环分解为其基本部分,并且您可以完全理解控制流。走过它。

    我们从i等于0开始。假设数组的长度是3。

    0小于3吗?是的。所以我们接下来去BODY。我们写入数组的第 0 个元素并将 i 递增到 1。现在我们回到 START。

    1 小于 3 吗?是的。所以我们接下来去BODY。我们写入数组的第 1 个元素并将 i 递增到 2。现在我们回到 START。

    2 小于 3 吗?是的。所以我们接下来去BODY。我们写入数组的第 2 个元素并将i 增加到 3。现在我们回到 START。

    3 小于 3 吗?不,所以我们转到 END,然后执行您的程序的其余部分。

    现在,您可能已经注意到“goto”表单非常丑陋,难以阅读和推理。 这就是我们发明 while 和 for 循环的原因,这样您就不必编写使用 goto 的糟糕代码。但是您可以总是通过在心理上回到 goto 形式来推断简单的控制流。

    【讨论】:

      【解决方案3】:
      i < myArray.Length; 
      

      这不是针对 myArray 中的值进行测试,而是针对长度(数组包含多少项)进行测试。因此它意味着:当 i 小于数组的长度时。

      所以循环将继续进行,每次循环时将 i 加 1(如您所说),当 i 等于数组的长度时,意味着它已经遍历了所有值,它将退出循环.

      正如 Nicolás Straub 指出的那样,i 是数组的索引,表示数组中项目的位置,您已将其初始化为 0,这是正确的,因为数组中的第一个值将具有索引为 0。

      直接回答你关于 for 循环的问题:

      一个for循环正在迭代地(多次)执行代码行,数量取决于它的控制语句:

      for (int i = 0; i < myArray.Length; i++)
      

      For 循环通常是前置条件(循环的条件在代码之前)并且有循环计数器,即 i(i 实际上是一个计数器,但可以看作是索引,因为你正在遍历每个元素,如果你想跳过一些然后我只会是一个柜台)。 For 非常适合当您知道要循环多少次在开始循环之前

      【讨论】:

      • 还有i是数组的索引
      【解决方案4】:

      你的想法是正确的,除了其他人所说的。将数组视为数据序列。您甚至可以使用 Reverse() 方法将其应用于您的数组。我会研究更多有关数组的信息,以便您了解可以对数组执行的不同操作,最重要的是,如果您需要在控制台、列表框或文本或 csv 文件中的网格视图中读取或写入它们。

      我建议你添加:

      Console.ReadLine();

      当您执行此操作时,应用程序将如下所示: 2 5 7 20 55

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        相关资源
        最近更新 更多