5

C++、C#、C、D、Java ......都是从零开始的。

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

4

6 回答 6

5

数组在 c 和 c++ 中为零,表示从项目列表开头的偏移量。

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

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

第一个是标准索引器,第二个是指针将三个添加到 id 然后去引用它。这与索引器相同。

于 2013-08-16T22:27:53.740 回答
2

好吧,考虑一下 Dijkstra 的著名文章,为什么编号应该从零开始。他认为编号应该从 0 开始,因为这意味着数组中的有效索引可以描述为0 <= i < N. 1 <= i < N + 1在美学层面上,这显然比 更具吸引力。

(有人可能会问,“为什么不说0 < i <= N”,但出于审美原因,他也反对这一点。)

于 2013-08-16T22:50:02.290 回答
1

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

假设如果你从 1 开始,那么要引用第 5 个元素,你将不得不执行类似 + (5-1) * size of int 之类的操作

于 2013-08-16T22:34:20.827 回答
0

我想这主要是历史原因,新语言只是尝试使用程序员熟悉的现有约定。

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

于 2013-08-16T22:27:26.360 回答
0

可能“C”得到了它,因为它更有效。要计算基于 0 的数组中项目的地址,只需按 ItemSize 进行多个索引就足够了,对于基于 1 的数组,您必须计算 (Index-1)*ItemSize。“C”然后是“C++”,这是最流行的语言,所以新语言必须遵循相同的规则,这有助于避免使用 C/C++ 的人犯错误。但是这个问题似乎是题外话,我想它会被版主关闭。

PS 在 Delphi/Pascal 中,字符串是从 1 开始的,但是对于数组,您必须提供范围,这样您就可以使用您喜欢的。

于 2013-08-16T22:34:41.737 回答
-1

因为有 10 个整数 0..9

于 2013-08-16T23:22:02.697 回答