Существуют ли другие общие "Си-подобным" или "C-подобных" языков с позиции нулевого индекса массива? [закрытый]
язык программирования C известен как язык массива нулевых индексов. Первый элемент массива доступен с помощью 0
. Например double arr[2] = {1.5,2.5}
первый элемент в массиве arr
находится в позиции 0. arr[0] === 1.5
какие языки программирования являются 1 индексы?
Я слышал, что эти языки начинаются с 1 вместо 0 для доступа к массиву: Algol, Matlab, Action!, Паскаль, Фортран, Кобол. Это все?
конкретно, массив на основе 1 будет иметь доступ к первому элементу с 1, а не ноль.
28 ответов:
список можно найти на Википедия.
ALGOL 68 APL AWK CFML COBOL Fortran FoxPro Julia Lua Mathematica MATLAB PL/I RPG Sass Smalltalk Wolfram Language XPath/XQuery
Fortran начинается с 1. Я знаю это, потому что мой отец программировал Fortran до моего рождения (мне сейчас 33 года), и он действительно критикует современные языки программирования за то, что они начинаются с 0, говоря, что это неестественно, а не так, как люди думают, в отличие от математики, и так далее.
тем не менее, я считаю, что все начинается с 0 вполне естественно; мой первый реальный язык программирования был C и *(ptr+n) не работал бы так хорошо, если бы n не начинался с нуля!
довольно большой список языков находится в Википедии под сравнение языков программирования (массив) в таблице" список перекрестных ссылок системы массивов " (столбец базового индекса по умолчанию)
этой имеет хорошее обсуждение 1 - против 0-индексированных и подписки в целом
цитата из блога:
EWD831 by E. W. Dijkstra, 1982.
при работе с последовательностью длины N, элементы которой мы хотите отличить по индексу, то следующий досадный вопрос - какой индекс значение, которое нужно присвоить его началу элемент. Присоединение к конвенции а) урожайность, начиная с подстрочного индекса 1, диапазон индексов 1 ≤ i
замечание: многие языки программирования были разработаны без должного внимание на эту деталь. на Фортране индексы всегда начинаются с 1; в АЛГОЛЕ 60 и в Паскале, конвенция с) был принят; более недавний SASL имеет упал обратно на конвенции Фортран : последовательность в SASL находится в то же время функция на положительных целых числах. Жаль! (Конец реплики.)
вы можете сделать это в Perl
$[ = 1; # set the base array index to 1
вы также можете сделать ее начать с 42 Если вы чувствуете, что. Это также влияет на строковые индексы.
на самом деле использование этой функции крайне не рекомендуется.
также в Ada вы можете определить свои индексы массива по мере необходимости:
A : array(-5..5) of Integer; -- defines an array with 11 elements B : array(-1..1, -1..1) of Float; -- defines a 3x3 matrix
кто-то может утверждать, что определенные пользователем диапазоны индексов массива приведут к проблемам обслуживания. Тем не менее, это нормально писать код Ada таким образом, который не зависит от индексов массива. Для этого язык предоставляет атрибуты элементов, которые автоматически определяются для всех определенных типов:
A'first -- this has the value -5 A'last -- this has the value +5 A'range -- returns the range -5..+5 which can be used e.g. in for loops
нашли один - на Lua (язык программирования)
Проверьте массивы раздел, который говорит -
"Lua массивы основаны на 1: первый индекс равен 1, а не 0, как это для многих других языков программирования (хотя явный индекс 0 допускается)"
строки Delphi пуск в 1.
(статические массивы должны иметь явно заданную нижнюю границу. Динамических массивов всегда начинается с 0.)
PL / SQL. Результатом этого является использование языков, которые начинаются с 0 и взаимодействуют с Oracle, вам нужно самостоятельно обрабатывать преобразования 0-1 для доступа к массиву по индексу. На практике, если вы используете конструкцию типа
foreach
по строкам или столбцам доступа по имени это не большая проблема, но вам может понадобиться самый левый столбец, например, который будет столбцом 1.
Visual FoxPro, FoxPro и Clipper все используют массивы, где элемент 1 является первым элементом массива... Я предполагаю, что это то, что вы подразумеваете под 1-индексированным.
Я вижу, что знание Фортран вот еще на версии ' 66.
Fortran имеет переменную как нижнюю, так и верхнюю границы массива.
значение, если вы объявляете массив как:
real, dimension (90) :: x
тогда 1 будет нижней границей (по умолчанию).
если вы объявите его как
real, dimension(0,89) :: x
потом, однако, он будет иметь нижнюю границу 0.
если с другой стороны вы заявляете это вроде
real, allocatable :: x(:,:)
тогда вы можете выделить его на все, что вам нравится. Например
allocate(x(0:np,0:np))
означает, что массив будет иметь элементы
x(0, 0), x(0, 1), x(0, 2 .... np) x(1, 0), x(1, 1), ... . . . x(np, 0) ...
возможны и более интересные комбинации:
real, dimension(:, :, 0:) :: d real, dimension(9, 0:99, -99:99) :: iii
, которые остаются в качестве домашнего задания для заинтересованного читателя :)
это только те, которые я помнил с головы до ног. Поскольку одной из основных сильных сторон fortran являются возможности обработки массивов, это ясно что есть много других входов и выходов, не упомянутых здесь.
вся Виртская линия языков, включая Pascal, Object Pascal, Modula-2, Modula-3, Oberon, Oberon-2 и Ada (плюс несколько других, которые я, вероятно, пропустил), позволяет индексировать массивы из любой точки, которую вы любите, включая, очевидно, 1.
Erlang индексирует кортежи и массивы от 1.
Я думаю-но уже не уверен-что Алгол и PL/1 оба индекса от 1. Я также уверен, что индексы Cobol от 1.
в основном самый высокий уровень языки программирования до c индексируются с 1 (при этом языки ассемблера являются заметным исключением по очевидным причинам – и причина c индексируется с 0), и многие языки из-за пределов гегемонии c-доминируют до сих пор делают это по сей день.
хотя C по дизайну индексируется 0, можно организовать доступ к массиву в C, как если бы он был индексирован 1 (или любое другое значение). Не то, что вы ожидаете, что обычный кодер C будет делать часто, но иногда это помогает.
пример:
#include <stdio.h> int main(){ int zero_based[10]; int* one_based; int i; one_based=zero_based-1; for (i=1;i<=10;i++) one_based[i]=i; for(i=10;i>=1;i--) printf("one_based[%d] = %d\n", i, one_based[i]); return 0; }