【问题标题】:Is there any reason for initializing iterations of a loop from zero instead of one when not using arrays?当不使用数组时,是否有任何理由从零而不是一初始化循环的迭代?
【发布时间】:2012-06-01 15:46:20
【问题描述】:

我是说

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

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

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

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

你怎么看?这是一种不好的做法还是不鼓励?

【问题讨论】:

    标签: java loops for-loop initialization


    【解决方案1】:

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

    另外,对我来说,

    for(int i = 0; i &lt; 6; i++) {

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我认为

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

        比阅读更难

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

        因为它是6 迭代。您需要从 7 中减去 1 才能看到第一个循环。

        这两个选项通常以0 开头并使用&lt; 作为您的条件,或者从1 开始并使用&lt;= 作为您的条件,如下所示:

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

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

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

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

        【讨论】:

          【解决方案4】:

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

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

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

          int element = arr[index];
          

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-31
            • 2014-02-12
            • 2018-03-02
            • 2016-11-12
            • 2011-09-15
            • 1970-01-01
            • 2010-09-16
            相关资源
            最近更新 更多