Arrays 为什么在大多数编程语言中数组索引都是零基的?

Arrays 为什么在大多数编程语言中数组索引都是零基的?,arrays,indexing,Arrays,Indexing,C++,C#,C,D,Java,。。。都是零基的 Matlab是我所知道的唯一一种从1开始的语言。我想这主要是历史原因,新的语言只是试图使用程序员熟悉的现有惯例 该规则起源的较旧语言接近于金属,索引实际上是起始元素的距离,因此 0 > /CUT>对于第一个元素是有意义的。 数组在C和C++中是零的,因为它代表了从列表的开始处的偏移。 这两行在c中有相同的结果 anArray[3] = 4; *(anArray +3) = 4; 第一个是标准索引器,第二个是指针,将三个指针添加到id,然后取消

C++,C#,C,D,Java,。。。都是零基的


Matlab是我所知道的唯一一种从1开始的语言。

我想这主要是历史原因,新的语言只是试图使用程序员熟悉的现有惯例


该规则起源的较旧语言接近于金属,索引实际上是起始元素的距离,因此<代码> 0 > /CUT>对于第一个元素是有意义的。

数组在C和C++中是零的,因为它代表了从列表的开始处的偏移。

这两行在c中有相同的结果

anArray[3] = 4;
*(anArray +3) = 4; 

第一个是标准索引器,第二个是指针,将三个指针添加到id,然后取消对它的偏移。这与索引器相同。

我猜是因为数组使用指针算法来引用某个值。基本上,数组有连续的内存,如果您想引用第5个元素(a[4]),则执行int的+4*大小

假设你从1开始,那么为了引用第5个元素,你必须做一些事情,比如a+(5-1)*int的大小可能是“C”,因为它更有效。要在基于0的数组中计算项的地址,按ItemSize对索引进行多次索引就足够了,对于基于1的数组,您必须计算(索引-1)*ItemSize。“C”和“C++”是最流行的语言,因此新语言必须遵循相同的规则,这有助于避免使用C/C++的人犯错误。 但这个问题似乎离题了,我想主持人会就此结束


在Delphi/Pascal字符串中,P.S.是基于1的,但是对于数组,你必须提供范围,这样你就可以使用你喜欢的。

< P> >,考虑Dijkstra的著名文章。他认为编号应该从0开始,因为这意味着数组中的有效索引可以描述为
0,因为有10个整数0..9

参见(遗憾的是,不能以重复形式关闭-将其移动到programmers.SE,然后关闭它似乎很愚蠢)。Matlab不是唯一的一个。Fortran是基于1的索引的一个很好的例子。我认为基于0的索引对于一般编程来说是更好的,而基于1的索引对于数学来说更自然。当你考虑<代码> 1 @晁时,这个论点有点平淡:这是所有的最坏的选择,因为这意味着如果你减去两个端点,你就不再得到数组的长度。这实际上是导致数组切片函数两端都包含的语言出现错误的原因。我通常更喜欢
(开始,长度)
我自己。你不会经常想要“项目X到X+N-1”或类似的东西;您需要“从索引X开始的N个项目”。这样,长度的争论就几乎消失了;现在几乎每一种自尊的语言都有知道长度的数组。@数组知道长度,但切片仍然非常有用和常见。可能在不必担心片的内存管理的语言中更常见。它将添加
3*sizeof(int)
假设这是
int
数组。这是指针算法。