【问题标题】:What's the purpose of arrays starting with nonzero index?以非零索引开头的数组的目的是什么?
【发布时间】:2011-06-09 03:57:13
【问题描述】:

我试图找到答案,但我得到的只是关于如何实现以非零索引开头的数组的答案。某些语言,例如 pascal,默认提供此功能,例如,您可以创建一个数组,例如

var foobar: array[1..10] of string;

我一直在想:为什么要让数组索引不以 0 开头?

我想对于初学者来说,数组以 1 开头并且最后一个索引是数组的大小可能更熟悉,但从长远来看,程序员应该习惯于以 0 开头的值。

我能想到的另一个目的:在某些情况下,索引实际上可以表示相应数组条目中包含的内容。例如,您想获取数组中的所有大写字母,将索引作为相应字母的 ASCII 码可能会很方便。但它很容易减去一个常数值。在此示例中,您可以(在 C 中)简单地执行类似这样的操作,获取所有大写字母并使用 ascii-code 67 访问该字母:

#define ASCII_SHIFT 65
main()
{
    int capital_letters[26];
    int i;
    for (i=0; i<26; i++){
        capital_letters[i] = i+ASCII_SHIFT;
    }   
    printf("%c\n", capital_letters[67-ASCII_SHIFT]);
}

另外,如果您想通过某种键访问条目,我认为您应该使用哈希表。

有人可能会反驳:为什么索引总是从0开始?好吧,这种方式要简单得多。声明数组时只需键入一个索引,速度会更快。此外,您始终可以确保第一个条目是 array[0],最后一个是 array[length_of_array-1]。其他数据结构以 0 开头也很常见。例如,如果您读取二进制文件,则从第 0 个字节开始,而不是第一个字节。

现在,为什么某些编程语言具有此“功能”,为什么有些人会问如何在 C/C++ 等语言中实现此功能?在任何情况下,以非零索引开头的数组更有用吗? ,甚至,从 0 开始的数组根本无法完成某些事情?

【问题讨论】:

  • 如你所料,我也觉得是为了让初学者更容易理解数组。
  • 古语:“未曾拥有,未曾错过”。基于非零的索引有很多用途(它们不仅仅是“初学者”)。 C 是一种低级语言,在设计时考虑到了效率,因此限制了从 0 开始的数组索引。高级语言不需要担心这个约束。如果您真的想对某事感到兴奋,请考虑 MATLAB 仅支持基于 1 的数组索引这一事实。
  • 这一切都可以用从零开始的数组来完成,值得回答:它都可以用机器代码完成。

标签: arrays programming-languages


【解决方案1】:

如果您的索引意味着什么,例如来自数据库的 id 或类似的,那么它很有用。

哦,您不能使用哈希,因为您想将它与其他一些需要数组的代码一起使用。

例如,Rails 复选框。它们作为数组从 Web 表单传递,但在我的代码中,我想访问底层数据库对象。数组索引就是id,瞧!

【讨论】:

    【解决方案2】:

    基于非零的数组是序数索引不是整数的数组的自然扩展。在 Pascal 中,您可以使用如下数组:

    var
      letter_count : array['a'..'z'] of integer;
    

    或者:

    type
      flags = (GREEN, YELOW, RED);
    var
      flags_seen = array[flags] of boolean;  
    

    经典是具有负索引的数组:

    zero_centered_grid = array[-N..N,-N..N] of sometype;
    

    这个想法是:

    • 如果索引的声明更具体,则可以在编译时检测到许多索引错误。
    • 当最小索引不为零时,某些算法(想到堆)具有更简洁的实现。

    只有从零开始的数组的语言对后者使用定义明确的惯用语,并且对其余的具有字典/映射的有效实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-22
      • 2019-04-01
      • 1970-01-01
      • 2011-04-17
      • 2018-06-04
      • 1970-01-01
      • 2011-03-20
      • 2019-03-13
      相关资源
      最近更新 更多