【问题标题】:Why array indexes are zero based in most programming languages?为什么在大多数编程语言中数组索引为零?
【发布时间】:2013-08-19 10:22:29
【问题描述】:

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

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

【问题讨论】:

  • programmers.stackexchange.com/q/110804/7043(遗憾的是,不能作为重复关闭 - 将其移至programmers.SE,然后关闭它似乎很愚蠢)。
  • Matlab 不是唯一的。 Fortran 是基于 1 的索引的一个很好的例子。我认为基于 0 的索引更适合一般编程,而基于 1 的索引更适合数学。

标签: arrays indexing


【解决方案1】:

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

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

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

第一个是标准索引器,第二个将指针添加到 id 上,然后对其进行解引用。与索引器相同。

【讨论】:

  • 它将添加 3* sizeof(int) 假设这是一个 int 数组。这是指针算法。
  • 所以这是因为内部机器表示,而不是因为人类思维和推理
【解决方案2】:

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

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

【讨论】:

  • 当你考虑1 <= i <= N 时,这个论点有点平淡——这在美学层面上更具吸引力,因为现在甚至关系运算符都匹配。 :)
  • @cHao:这是最糟糕的选择,因为这意味着如果你减去两个端点,你将不再得到数组的长度。这实际上是导致数组切片函数在两端包含的语言中出现错误的原因。
  • 嗯。我自己通常更喜欢(start, length)。你不经常想要“项目 X 到 X+N-1”或类似的东西;你想要“从索引 X 开始的 N 个项目”。有了这个,长度参数几乎消失了;如今,几乎所有自尊的语言都有知道其长度的数组。
  • @cHao 数组知道它们的长度,但切片仍然非常有用和常见。也许在您不必担心切片的内存管理的语言中更为常见。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        因为0..9有10个整数

        【讨论】:

          猜你喜欢
          • 2011-02-20
          • 1970-01-01
          • 2018-01-11
          • 1970-01-01
          • 2011-04-01
          • 2012-01-31
          • 1970-01-01
          • 2019-07-16
          相关资源
          最近更新 更多