【发布时间】: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