Как другой вариант, давайте спросим, почему в некоторых языках индекс массива начинается с нуля? Для подсчета дискретных объектов (например, элементов массива) это не имеет большого смысла и не является естественным с точки зрения человека.
Первоначально казалось, что это происходит от таких языков, как C (хотя я не предполагаю, что это впервые возникло в C: я не знаю, и это не имеет значения для целей этого), в которых язык и его программирование довольно тесно связан с управлением памятью (malloc
и т. д.). В некотором языке Си довольно точно отображено то, что происходит в памяти под капотом. Переменные являются примером этого: помимо имен переменных, мы всегда заняты адресом памяти, в которой находится переменная (или начинается с ) с указателями и тому подобным.
Итак, мы приходим к массивам в C, и они индексируются таким образом, что существует ряд элементов, которые находятся в памяти, начиная с базовой ячейки памяти переменной массива, и каждый элемент смещается на размер тип данных (например, символ - один байт и т. д.). Таким образом, чтобы найти каждый элемент в массиве в памяти, мы делаем это:
arrayBaseAddress + (whichElementItIsInTheArray * sizeOfDataType)
И на самом деле человек действительно так думает, когда делает что-то в C, потому что он довольно близко соответствует тому, что компьютер должен делать изнутри, чтобы найти значение, которое хочет код.
Таким образом, whichElementItIsInTheArray
используется для смещения адреса памяти (в единицах sizeOfDataType
).
Очевидно, что если начинать индекс массива с 1, он будет смещен в памяти на один sizeOfDataType
, для всех намерений и целей тратится количество sizeOfDataType
памяти между arrayBaseAddress
и местом, где фактически находится первый элемент .
Кто-то может подумать, что это вряд ли имеет значение, но в былые времена, когда все это реализовывалось, память была как золото: ее нельзя так тратить впустую. Поэтому можно подумать: «Хорошо, просто смести whichElementItIsInTheArray
на -1 под капотом и покончим с этим. Однако, как и память, тактовые частоты были золотыми, поэтому вместо того, чтобы тратить впустую обработку, идея была в том, что программисту просто нужно привыкнуть к неестественному способу подсчета.
Так что было законной причиной для запуска массивов с нулевым индексом в этих ситуациях.
Мне кажется (и это сейчас входит в редакционный уклон), когда вышли последующие языки "фигурных скобок" (например, Java), они просто следовали примеру, было ли это действительно актуально до сих пор или нет, потому что "это так, как это делается" ». Вместо "этот путь имеет смысл".
С другой стороны, более современные языки, и те, которые еще больше удалены от внутренней работы компьютера, кто-то перестал думать «зачем мы это делаем?» И «в контексте этого языка и его предполагаемого использования» Имеет ли это смысл?". Я согласен здесь, чем ответ - твердо - «нет». Потеря ресурсов для смещения индекса массива на -1 или просто игнорирования памяти нулевого элемента больше не является важным фактором во многих обстоятельствах. Так почему же язык и программист вынуждены компенсировать то, как они естественным образом считают вещи, по чисто наследственной причине? Нет законных оснований для этого.
В C есть элемент массива a[0]
. Это первый элемент массива (не "нулевой" элемент), и если это полный экстент массива, его длина равна one . Таким образом, своеобразное поведение здесь относится к языку программирования, а не к тому, как все подсчитывается / перечисляется «в реальной жизни» (именно там проживает большинство из нас). Так зачем же настаивать на этом?
Некоторые люди здесь противопоставляют этот аргумент «с чего начать индекс» словами «хорошо, когда мы родились, мы не ОДИН, мы НОЛЬ». Это правда, но это измеряет непрерывную вещь, и это не одно и то же. Так что не имеет отношения к разговору. Массив - это набор дискретных элементов, и при измерении количества дискретных элементов (т. Е. Подсчета их) мы начинаем с единицы.
Как это добавляет к разговору? Ну, это не так много, но это другой взгляд на одно и то же. И я полагаю, что это некоторая рационализация / реакция на это понятие, которое некоторые люди считают, что запуск индексов массива в 1 как-то «неправильный». Это не так, с человеческой точки зрения это более правильно, чем начинать их с нуля. Итак, пусть человек напишет код, как это сделал бы человек, и заставит машину разобраться в этом, когда это необходимо. По сути, только из-за унаследованных технологических ограничений мы вообще начинали считать их с нуля, и нет необходимости увековечивать эту практику, если нам больше не нужно.
Все "ИМО", конечно.