Почему компьютеры отсчитывают от нуля?
Подсчет с нуля - очень распространенная практика на многих компьютерных языках, но почему? Читайте дальше, когда мы исследуем это явление и почему оно так широко распространено..
Сегодняшняя сессия вопросов и ответов пришла к нам благодаря SuperUser - подразделению Stack Exchange, группе веб-сайтов вопросов и ответов, управляемой сообществом..
Вопрос
Читатель SuperUser DragonLord интересуется, почему большинство операционных систем и языков программирования считаются с нуля. Он пишет:
Компьютеры традиционно подсчитывают числовые значения, начиная с нуля. Например, массивы в языках программирования на основе C начинаются с нуля индекса.
Какие исторические причины для этого существуют, и какие практические преимущества имеет счет от нуля по сравнению с счетом от одного?
Почему так? Как бы ни была широко распространена практика, безусловно, есть практические причины для ее реализации..
Ответ
Участник SuperUser Matteo предлагает следующие идеи:
Подсчет массивов от 0 упрощает вычисление адреса памяти каждого элемента.
Если массив хранится в данной позиции в памяти (это называется адресом), позиция каждого элемента может быть вычислена как
элемент (n) = адрес + n * size_of_the_element
Если вы считаете первый элемент первым, вычисление становится
элемент (n) = адрес + (n-1) * size_of_the_element
Не большая разница, но добавляет ненужное вычитание для каждого доступа.
Отредактировано, чтобы добавить:
- Использование индекса массива в качестве смещения - это не требование, а просто привычка. Смещение первого элемента может быть скрыто системой и учтено при выделении и ссылке на элемент.
- Дейкстра опубликовал статью «Почему нумерация должна начинаться с нуля» (pdf), где он объясняет, почему начинать с 0 - лучший выбор. Начиная с нуля, можно лучше представить диапазоны.
Если вы хотите углубиться в ответ, статья Дейкстры - это информативное чтение.
Есть что добавить к объяснению? Звук выключен в комментариях. Хотите узнать больше ответов от других технически подкованных пользователей Stack Exchange? Ознакомьтесь с полным обсуждением здесь.