Почему индекс начинается с нуля
Перейти к содержимому

Почему индекс начинается с нуля

Почему во многих языках индексирование начинается с 0?

По-моему, это из электроники, разве нет?
С чего вообще это пошло?

В первую очередь потому, что с точки зрения реализации понятие «индекса» элемента в непрерывном агрегате напрямую связано с понятием «смещения» элемента от начала агрегата в памяти. Понятно, что смещение самого первого элемента агрегата равно нулю. Соответственно и индекс его разумно взять равным нулю.

Другими словами, как ни верти, но индекс первого элемента в агрегате все равно придется пересчитывать в значение 0 на машинном уровне. В такой ситуации реализация индексации с ненулевой базой будет всегда волей-неволей подразумевать неявное приведение ее к индексации с нулевой базой. В многих языках программирования просто не считают необходимым это делать. Зачем, действительно?

Почему нумерация должна начинаться с нуля

Почему нумерация должна начинаться с нуля главное изображение

Чтобы обозначить последовательность натуральных чисел 2, 3, …, 12 без неприятного троеточия, по соглашению можно использовать следующие четыре варианта нотации:

  1. 2 ≤ i < 13 .
  2. 1 < i ≤ 12 .
  3. 2 ≤ i ≤ 12 .
  4. 1 < i < 13 .

Есть ли предпочтительные варианты? Да. Первый и второй варианты имеют преимущество: разница между обозначенным началом и концом последовательности равна длине последовательности. Также в этих вариантах при использовании смежных последовательностей можно сказать, что конец одной последовательности будет началом второй. Пока недостаточно данных, чтобы выбрать между первым и вторым вариантом, поэтому начнём сначала.

Есть наименьшее натуральное число. Во втором и четвёртом варианте исключены нижние границы последовательности. Это приводит к тому, что для последовательностей, которые начинаются с наименьшего натурального числа, смежные последовательности уходят из области натуральных чисел. Это неудобно и некрасиво, поэтому для обозначения нижней границы предпочтительно использовать знак ≤ как в первом и третьем варианте.

Теперь рассмотрим последовательности, которые начинаются с наименьшего натурального числа. Включение верхней границы здесь превращает пустую последовательность в неестественную. Это неудобно и некрасиво, поэтому для обозначения верхней границы предпочтительно использовать знак < как в первом и четвёртом варианте. Приходим к выводу, что первый вариант предпочтительный.

Обратите внимание, язык программирования Mesa, разработанный в Xerox PARC, имеет специальную нотацию для записи интервалов чисел с помощью всех четырёх соглашений, указанных выше. Опыт использования Mesa показал, что использование второго, третьего и четвёртого варианта приводит к ошибкам. Поэтому программисты при работе с Mesa используют для обозначения последовательностей первый вариант соглашения. Эта ремарка для тех, кому важно получить результаты практических экспериментов, а не только теоретические заключения.

Когда речь идёт о последовательности с длиной N, которую мы хотим определить по нижнему индексу, следующий важный вопрос касается того, какой индекс присвоить первому элементу. Придерживаясь первого варианта нотации, получаем нижний индекс 1 ≤ i < N+1 . Но если начать с нуля, получим диапазон 0 ≤ i < N , что выглядит более понятно и красиво. Так что давайте нумеровать с нуля. Порядковый номер элемента равен числу элементов, которые предшествуют ему в последовательности. Мораль истории в том, что ноль стоит считать самым натуральным числом.

Многие языки программирования разработаны без должного внимания к этой детали. В Fortran сабскрипты начинаются с 1 , в Algol 60 и Pascal принят третий вариант нотации. Более новый SASL использует вариант, принятый в Fortran. Последовательность в SASL одновременно является функцией положительных чисел. Жалкий подход!

Эту заметку я написал, когда один из моих коллег-математиков, но не информатик, упрекнул более молодых специалистов по информатике в педантизме из-за их привычки нумеровать последовательности с нуля. Он сознательно назвал самое разумное соглашение провокацией. Также соглашение «End of. » рассматривается как провокационное. Тем не менее оно полезное. Я видел студента, который чуть не провалился на экзамене, так как посчитал, что вопросы заканчиваются в конце первой страницы. Думаю, Энтони Джей был прав, когда заметил следующее: «В корпоративных религиях, как и в любых других, еретиков изгоняют не потому, что они неправы, а потому, что они могут быть правыми».

Почему свойство length начинает считать с единицы, а не с нуля, если в массиве счет начинается с нуля?

Вот я сейчас смотрю видеокурс по JavaScript-у, тема — «Массивы». Не понимаю, почему если счёт в массивах начинается с нуля:

Тогда почему счет в свойстве length начинается с единицы?
console.log(arr.length); // 3

  • Вопрос задан более года назад
  • 500 просмотров
  • Facebook
  • Вконтакте
  • Twitter

Как раз с длиной всё очевидно. length – количество элементов массива:
Индексы начинают с нуля, потому, что индекс – это смещение.
Исторически, с низкоуровневых языков программирования.
В памяти под массив выделена некоторая память, начиная с адреса X .
Последовательно находятся ячейки одинаковой длины. Чтобы найти, где лежит значение i-го элемента, к адресу X прибавляют i * size байт. Самый первый элемент начинается сразу с адреса X . Его индекс 0 .

Так же и со строкой в JavaScript: к буквам можно обращаться по индексу, как к элементам массива.
Представьте, что в начале строки стоит курсор. Курсор возвращает букву перед которой стоит. Индекс – на сколько вправо надо этот курсор подвинуть.

Эта особенность index / length общепринята во многих языках программирования. Так же, как для интервалов часто принято включать начало и исключать конец: [a; b) – например, в методе массива slice() , который вырезает кусок массива, если указать slice(1, 5) — вытащит элементы с индексами 1, 2, 3, 4 – включая 1-й, но не доходя до 5.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *