Нумерация с нуля


Нумерация с отсчетом от нуля — это способ нумерации , при котором начальному элементу последовательности присваивается индекс 0, а не индекс 1, как это обычно бывает в повседневных нематематических или не программных обстоятельствах. При нумерации с отсчетом от нуля начальный элемент иногда называют нулевым элементом [1] , а не первым элементом; нулевой - это придуманное порядковое число , соответствующее числу ноль. В некоторых случаях объект или значение, которые (изначально) не принадлежат данной последовательности, но которые могут быть естественным образом помещены перед ее начальным элементом, могут быть названы нулевым элементом. Нет широкого согласия относительно правильности использования нуля в качестве порядкового номера (а также относительно использования термина « нулевой » ), поскольку это создает двусмысленность для всех последующих элементов последовательности при отсутствии контекста.

Последовательности нумерации, начинающиеся с 0, довольно распространены в математической нотации, в частности в комбинаторике , хотя языки программирования для математики обычно индексируются с 1. [2] [3] [4] В компьютерных науках индексы массивов обычно начинаются с 0 в современных языках программирования . , поэтому программисты могут использовать zeroth в ситуациях, когда другие могут использовать first и так далее. В некоторых математических контекстах нумерация с нуля может использоваться без путаницы, когда порядковые формы имеют устоявшееся значение с очевидным кандидатом на место первым ; например нулевая производнаяфункции — это сама функция, полученная дифференцированием нуль раз. Такое использование соответствует именованию элемента, не принадлежащего собственно последовательности, но предшествующего ей: нулевая производная на самом деле вообще не является производной. Однако, как первая производная предшествует второй производной , так и нулевая производная (или сама исходная функция) предшествует первой производной .

Мартин Ричардс , создатель языка BCPL (предшественник C ), разработал массивы, начинающиеся с 0, как естественную позицию для начала доступа к содержимому массива в языке, поскольку значение указателя p , используемого в качестве адреса, обращается к позиции p + 0 в памяти. [5] [6] BCPL был впервые скомпилирован для IBM 7094 ; язык не вводил косвенный поиск во время выполнения , поэтому косвенная оптимизация, обеспечиваемая этими массивами, выполнялась во время компиляции. [6] Тем не менее, оптимизация была важна. [6] [7]

Эдсгер В. Дейкстра позже написал уместную заметку « Почему нумерация должна начинаться с нуля » [8] в 1982 г., анализируя возможные схемы индексов массивов, заключая их в цепочку неравенств, комбинируя четкие и стандартные неравенства с четырьмя возможностями, демонстрируя, что, по его убеждению, массивы с отсчетом от нуля лучше всего представляются непересекающимися диапазонами индексов, которые начинаются с нуля, намекая на открытые, полуоткрытые и закрытые интервалы , как в случае с действительными числами. Критерии Дейкстры для предпочтения этого соглашения в деталях заключаются в том, что оно представляет пустые последовательности более естественным образом ( ai < a  ?), чем закрытые «интервалы» ( ai ≤ (a −1) ?), и что с полуоткрытыми «интервалами» натуральных чисел длина подпоследовательности равна верхней минус нижней границе ( ai < b дает ( ba ) возможных значений для i , где a , b , i все целые числа).

Такое использование следует из вариантов дизайна, встроенных во многие влиятельные языки программирования , включая C , Java и Lisp . В этих трех типах последовательностей (массивы C, массивы и списки Java и списки и векторы Lisp) индексация начинается с нулевого нижнего индекса. В частности, в C, где массивы тесно связаны с арифметикой указателей , это упрощает реализацию: нижний индекс указывает на смещение от начальной позиции массива, поэтому первый элемент имеет смещение, равное нулю.