为什么像C这样流行的编程语言从0开始使用数组呢?

时间:2012-02-07 10:24:26

标签: programming-languages

  

可能重复:
  Why does the indexing start with zero in 'C'?

为什么像C这样的流行编程语言从0开始使用数组?我知道像PASCAL这样的编程语言有从1开始的数组。这样做有什么好的理由吗?或者仅仅是历史原因?

5 个答案:

答案 0 :(得分:3)

因为您相对于数组的开头按偏移量访问数组元素。

第一个元素位于偏移量0。

后来出现了更复杂的数组数据结构(例如SAFEARRAY),允许任意下限。

答案 1 :(得分:3)

在C中,数组的名称本质上是指针,对内存位置的引用,因此表达式 array [n] 指的是内存位置 n-elements 远离起始元素。这意味着索引用作 偏移量 。数组的第一个元素完全包含在数组引用的内存位置(0个元素之外),因此它应该表示为array [0]。大多数编程语言都是以这种方式设计的,因此从0开始的索引几乎是该语言所固有的。

然而,Dijkstra解释了为什么我们应该从0开始索引。这是一个关于如何表示自然数的子序列的问题,例如1,2,3,...,10。我们有四种解决方案:

一个。 0<我< 11

湾1< = i< 1 11

℃。 0<我< = 10

d。 1< = i< = 10

Dijkstra辩称,正确的符号应该能够自然地表示以下两种情况:

  1. 子序列包括最小的自然数0
  2. 子序列为空
  3. 要求1.省略 a。 c。,因为它们的格式为 -1<我使用不在自然数集中的数字(Dijkstra说这很难看)。所以我们留下 b。 d。现在要求2.省略 d。,因为对于包含0的集合缩小到了空的, d。采用 0< = i< = -1 的形式,这有点混乱!减去 b。中的范围,我们也得到序列长度,这是另一个加号。因此,我们留下了 b。,这是目前编程中使用最广泛的符号。

    现在你知道了。所以,记住并为每次写一些像

    这样的事实感到自豪
    for( i=0; i<N; i++ ) {
        sum += a[i];
    }
    

    您不仅仅遵循语言符号规则。你也在推动数学美容!

    here

答案 2 :(得分:2)

在assembly和C中,数组被实现为内存指针。第一个元素存储在指针的偏移量0处。

答案 3 :(得分:1)

在C数组中绑定指针。数组索引是您添加到指向数组初始元素的指针的数字。这与PDP-11的一种寻址模式有关,您可以在其中指定基址,并在寄存器中放置一个偏移量来模拟数组。顺便说一句,这是++--来自的地方:PDP-11提供了所谓的自动递增和自动递减寻址模式。

P.S。我认为Pascal默认使用1;通常,您可以明确指定数组的范围,因此您可以在-10开始,如果需要,可以在+20结束。

答案 4 :(得分:1)

假设您只能存储两位。这给你四个组合: 00 10 01 11现在,将整数分配给这4个值。两个合理的映射是:

00->0
01->1
10->2
11->3

11->-2 
10->-1 
00->0 
01->1

(另一个想法是使用带符号的幅度并使用映射: 11->-1 10->-0 00->+0 01->+1

使用00表示1并使用11表示4是没有意义的。从0开始计数是很自然的。从1算起不是。