C++、C#、C、D、Java ......都是从零开始的。
Matlab 是我所知道的唯一一种从 1 开始的语言。
数组在 c 和 c++ 中为零,表示从项目列表开头的偏移量。
这两行在 c 中具有相同的结果。
anArray[3] = 4;
*(anArray +3) = 4;
第一个是标准索引器,第二个是指针将三个添加到 id 然后去引用它。这与索引器相同。
好吧,考虑一下 Dijkstra 的著名文章,为什么编号应该从零开始。他认为编号应该从 0 开始,因为这意味着数组中的有效索引可以描述为0 <= i < N
. 1 <= i < N + 1
在美学层面上,这显然比 更具吸引力。
(有人可能会问,“为什么不说0 < i <= N
”,但出于审美原因,他也反对这一点。)
我猜是因为数组使用指针算术来引用某个值。基本上数组有连续的内存,如果你想引用第 5 个元素 (a[4]) 则执行 a + 4 * size of int
假设如果你从 1 开始,那么要引用第 5 个元素,你将不得不执行类似 + (5-1) * size of int 之类的操作
我想这主要是历史原因,新语言只是尝试使用程序员熟悉的现有约定。
该规则起源的旧语言接近金属,索引实际上是与起始元素的距离,因此0
对于第一个元素是有意义的。
可能“C”得到了它,因为它更有效。要计算基于 0 的数组中项目的地址,只需按 ItemSize 进行多个索引就足够了,对于基于 1 的数组,您必须计算 (Index-1)*ItemSize。“C”然后是“C++”,这是最流行的语言,所以新语言必须遵循相同的规则,这有助于避免使用 C/C++ 的人犯错误。但是这个问题似乎是题外话,我想它会被版主关闭。
PS 在 Delphi/Pascal 中,字符串是从 1 开始的,但是对于数组,您必须提供范围,这样您就可以使用您喜欢的。
因为有 10 个整数 0..9