我将对你的编程知识做一些假设,如果这个解释涵盖了你已经熟悉的主题,请原谅我,但它们对于理解 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 事件执行一次。您对此部分的评论是正确的。
回顾一下事情发生的顺序:
- 索引初始化器
- 条件检查(如果检查返回
false,则“突破”或停止循环)
- 循环体
- 索引增量器
- 从第 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