Почему индексация массива в Java начинается с 0?
Почему индексация массива выполняется с 0, а не с 1 в таких языках программирования, как Java? Я абсолютно новичок в Java, любое объяснение приветствуется.
5 ответов
Java использует индексацию с нуля, потому что c использует индексацию с нуля. C использует индексирование на основе нуля, потому что индекс массива является не чем иным, как смещением памяти, поэтому первый элемент массива находится в памяти, на которую он уже указывает, *(array+0)
,
Чтобы расширить ответ @ Кевина, я беру эту цитату из ответа на Programmers.SE:
Индекс в массиве на самом деле не является индексом. Это просто смещение, которое является расстоянием от начала массива. Первый элемент находится в начале массива, поэтому расстояние отсутствует. Следовательно, смещение равно 0.
Кроме того, если вы хотите узнать больше о том, как разные языки выполняют индексацию своих массивов, посмотрите этот исчерпывающий список в Википедии.
Цитата Дейкстры из " Почему нумерация должна начинаться с нуля" (1982):
Когда речь идет о последовательности длины N, элементы которой мы хотим различить по нижнему индексу, следующий неприятный вопрос заключается в том, какое значение нижнего индекса нужно присвоить его начальному элементу. Придерживаясь соглашения а), при запуске с нижним индексом 1 получается нижний индекс 1 ≤ i < N+1; однако, начиная с 0, получаем более хороший диапазон 0 ≤ i < N. Итак, позвольте нашим порядковым номерам начинаться с нуля: порядковый номер элемента (индекс) равен числу элементов, предшествующих ему в последовательности. И мораль этой истории заключается в том, что мы лучше считали - после всех этих веков! - ноль как наиболее естественное число.
Обсуждение этой статьи можно найти в Lambda the Ultimate - почему нумерация должна начинаться с 0.
Я представил ответ на этот вопрос на диаграмме ниже, которую я написал на листе бумаги, который не требует пояснений.
Основные шаги:
- Создание ссылки
- Создание экземпляра массива
- Размещение данных в массиве
----------
- Также обратите внимание, когда массив только что создается.... По умолчанию всем блокам присваивается ноль, пока мы не присвоим ему значение
- Массив начинается с нуля, потому что первый адрес будет указывать на ссылку (i:e - X102+0 на изображении)
Примечание: блоки, показанные на изображении, представляют собой память
Я также разместил этот ответ здесь
Подводя итог его аргументации:
При работе с подпоследовательностями натуральных чисел разница между верхней границей и нижней границей должна быть длиной подпоследовательности. Индексы массива можно рассматривать как особый вид такой подпоследовательности. Нижняя граница должна быть включающей, верхняя граница должна быть исключительной. Другими словами, нижняя граница должна быть первым индексом массива. В противном случае мы рискуем иметь нижнюю границу неестественных чисел для некоторых подпоследовательностей. Если мы хотим сохранить условия (1) и (2), то у нас фактически есть два варианта выбора верхней и нижней границ: 1 <= i
Это все наследие со времен, когда языки программирования, такие как C, были просто ассемблерами высокого уровня. Программисты-мэйверики провели прекрасную жизнь, занимаясь арифметикой с указателями, поэтому они стали второй натурой считать с нуля. Теперь они передают это наследие многим современным языкам. Вы даже можете читать заявления как "Ноль - самое натуральное число". Ноль не натуральное число. В реальной жизни люди не считают с нуля, математики - нет, физики - нет, статистики не считают с нуля... это всего лишь информатика.
Кроме того, вы не говорите "у меня ноль яблок", чтобы выразить тот факт, что у вас нет яблок, в противном случае, следуя той же логике, вы бы сказали "У меня нет минус один яблок", чтобы выразить тот факт, что вы есть одно яблоко:P