Почему массив начинается с нуля?

UPD: читаем комментарии — мое объяснение не совсем верное, но будет понятно каждому.

Недавно ко мне мой ученик обратился с вопросом, почему во всех массивах индексы идут с нуля, а не с единицы... для человека, который приходит только-только в программирование это кажется очень не логичным.

Попробую наглядно объяснить, почему так принято в этом самом программировании и зачем это нужно.

Точка отсчета

Чтобы обозначить проблему при использовании отсчета массива не с нуля, а с единицы, приведу пример:

Вам нужно вывести набор значений — например динамику посещений кафе и эффективность той или иной рекламы... нужно вывести количество людей за месяц.

Когда вы будете выводить на графике или в таблице данные, вы сразу столкнетесь с тем, что 1 — будет результат за январь, а 12 — результат за декабрь. А где же будет исходно значение? Относительно чего будет прирост в январе?

Правильно! К моменту подсчета у вас должно быть какое-то значение, оно может быть равно нулю или иметь какое-то численное значение. И в массиве значений оно будет первым:

{
0 => 2 тыс // столько было например в прошлом месяце, если кафе открылось, то оно будет равно 0
1 => 1.7 тыс // посещения в январе
2 => 2.1 тыс // посещения в феврале
3 => 1.9 тыс // посещения в марте
...
12 => n тыс  // посещения в декабре
}

Таких аналогий может быть сколько угодно: возраст человека, графики занятий, изменения температуры воздуха за день. Правда бывают не совсем логичные моменты, например когда выгружаем массив товаров в категории интернет-магазина, то по логике первый товар должен быть именно первым, а не нулевым. Но тогда бы в языках программирования было бы сложно работать и появилось бы много путаницы. В любом случае бывают ассоциированные массивы, где индексом выступает какой-то ключ, который можно задать по своей логике.

Менять этого уже точно никто не будет, всем новичкам нужно понять и попробовать прорешать несколько задач с массивами и стеками, чтобы разобраться что к чему.

Когда нужно вывести первый элемент массива уже на автомате пишешь

$array[0]

где 0 — индекс первого элемента :)




Вроде как даже создатель языка Python (по-нашему Питон) хотел ввести индексацию массивов с единицы, но сообщество восприняло это в штыки...

Поделиться
Отправить
Запинить
1 комментарий
deadem

На самом деле, это тупо техническое решение, а совсем не идеологическое.

В низкоуровневых языках (а с них всё начиналось), отсчёт идёт с нуля, так как индекс — это просто второе слагаемое. Первое слагаемое — это указатель на сам массив. То есть, вот есть у нас массив в памяти из 10 элементов, расположенных, начиная с адреса 800, какой адрес в памяти будет у первого элемента? Правильно, 800. А у десятого? 809. Запись index[0] по сути означает index + 0.

В C, например, даже неважно в каком порядке слагаемые будут записаны. Так, если есть переменные
int a[1000]; и int b = 10, то записи a[b] и b[a] — эквивалентны.

А в Pascal, языке, ориентированном в первую очередь на понятность, отсчёт можно вести с любого числа:
var x = array[1..100] of integer или var x = array[-100, 200] of integer, и т. п. при этом индексы в массиве будут начинаться с того значения, которое нужно именно тут.

Максим Федоров

Спасибо большое!

Ваш комментарий
адрес не будет опубликован

ХТМЛ не работает

Ctrl + Enter
Популярное