为什么像C这样的流行编程语言从0开始使用数组?我知道像PASCAL这样的编程语言有从1开始的数组。这样做有什么好的理由吗?或者仅仅是历史原因?
答案 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.省略 a。和 c。,因为它们的格式为 -1<我使用不在自然数集中的数字(Dijkstra说这很难看)。所以我们留下 b。和 d。现在要求2.省略 d。,因为对于包含0的集合缩小到了空的, d。采用 0< = i< = -1 的形式,这有点混乱!减去 b。中的范围,我们也得到序列长度,这是另一个加号。因此,我们留下了 b。,这是目前编程中使用最广泛的符号。
现在你知道了。所以,记住并为每次写一些像
这样的事实感到自豪for( i=0; i<N; i++ ) {
sum += a[i];
}
您不仅仅遵循语言符号规则。你也在推动数学美容!
答案 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算起不是。