2

我是说

for (int i=1; i<7; i++) 

当它纯粹是为了迭代次数时更具可读性

for (int i=0; i<6; i++)

但在某种程度上,另一种方法已成为标准。

你怎么看?这是不好的做法还是气馁?

4

4 回答 4

5

我认为这仅仅是因为数组几乎总是从 0 开始,所以当设计师创建其他具有集合的非数组对象时,他们也倾向于使它们也从 0 开始。0-based 只是一个标准,所以坚持它只是维护者的一致性和易用性。

另外,对我来说,

for(int i = 0; i < 6; i++) {

更具可读性,因为我知道当 1 个循环完成时,计数 ( i) 将为 1。从 1 开始,在第一个循环之后,计数为i = 2. 这让我有点失望。

于 2012-06-01T15:47:30.010 回答
2

习俗。零索引在历史上如此普遍和普遍,除非有特定的理由不这样做,否则这是程序员期望看到的。如果他们看到从 1 开始索引的循环,他们通常不会认为“啊,这更容易阅读”,他们会认为“哦,最好弄清楚为什么我们从这里开始。”

于 2012-06-01T15:50:14.213 回答
1

我会争辩说

for (int i=1; i<7; i++) 

比阅读更难

for (int i=0; i<6; i++)

因为它是6迭代。您需要从第一个循环中减去17找出答案。

这两个选项通常是 start at0<用作您的条件,或者 start at1<=用作您的条件,如下所示:

for (int i=1; i<=6; i++)

请注意,某些语言(例如 MATLAB)会索引从 1 开始的所有内容。

通常发生的是语言中的所有循环都遵循其最基本/广泛使用的自然索引结构的索引约定。在 Java 中,数组的索引为0,并且因为从基于 0 的索引切换到基于 1 的索引并返回很痛苦,所以一切都变成了 0 索引。

为了比较,在 MATLAB 中,数组和矩阵是 1 索引的,因此所有循环通常也是 1 索引的。

于 2012-06-01T15:58:49.583 回答
0

它可以追溯到 c 指针时代(我的 c 生锈了,请原谅我)。以下是c中的数组声明

int arr[10] = { ... };

实际上,“arr”变量实际上是“int *”类型(但如上所述声明它可以让编译器在超出范围时强制自动清理,而不是带有 malloc 的 int *),它指向一个有足够连续空间容纳 10 个 int 值的内存位置。然后访问数组:

int element = arr[index];

访问中真正发生的事情是:

int element = * (arr + index*sizeof(int));

它获取指针,向指针添加足够的字节以指向您感兴趣的元素的内存位置(括号中的部分),然后取消引用它以获取值(*)。

因此,对于数组中的第一个元素,您的索引为 0,因为指针已经指向第一个元素,因此您无需向内存位置添加任何内容。

将索引视为“我必须向指针添加多少个插槽才能找到我想要的内容”。

于 2012-06-01T17:44:14.440 回答