Чи існують інші поширені мови «c-подібні» чи не «c-подібні» з ненульовою позицією масиву індексу? [зачинено]


76

Мова програмування C відома як мова масиву нульового індексу. До першого елемента масиву можна отримати доступ за допомогою 0. Наприклад, double arr[2] = {1.5,2.5}перший елемент масиву arrзнаходиться в положенні 0. arr[0] === 1.5Які мови програмування є 1 індексами?

Я чув, що ці мови починаються з 1 замість 0 для доступу до масиву: Algol, Matlab, Action !, Pascal, Fortran, Cobol. Це повне?

Зокрема, масив на основі 1 отримає доступ до першого елемента з 1, а не з нулем.


8
Це має бути вікі
Остін Салонен

48
Чому люди голосують за закриття за "не справжнє питання"? Цілком очевидно, що це справжнє питання. Можливо, це не найкращий з усіх, які коли-небудь бачив сайт, і він може бути гідним уваги, але, звичайно, не тому, що це "не справжнє питання".
Chris Lutz,

2
Майже майже все, що було до C, оскільки все, що індексується Нулем, починалося як артефакт реалізації assmebler / C (оскільки справжні люди не враховуються від Нуля). Тож Basic (s), COBOL, Fortran (s) та більшість мов, що походять від них.
RBarryYoung

1
Думаю, заголовок неправильно відформатований як запитання, але основний текст, безумовно, є. Як це не справжнє запитання?
Саманта Бранхам

7
Кріс Луц: RE: Гірка; ще не дуже гіркий, давайте просто скажемо "вередливий і незадоволений", особливо. з / голосуванням на цьому сайті. RE: "Їжа для програмування"; Ви знаєте, що я використав цю назву як жарт, але тут насправді є тема, майже ідентична цій, яка була відкрита вже рік: stackoverflow.com/questions/92257/programmers-food . Це те, що мене викликає невдоволення, голосування тут не має нічого спільного з реальними питаннями програмування, а все, що пов’язано з певною субкультурою програміста, яку містить цей сайт. Субкультура, яка є одночасно і приходською, і близькою за духом.
RBarryYoung

Відповіді:


63

Список можна знайти на wikipedia .

ALGOL 68
APL
AWK
CFML
COBOL
Fortran
FoxPro
Julia
Lua
Mathematica
MATLAB
PL/I
Ring
RPG
Sass
Smalltalk
Wolfram Language
XPath/XQuery

10
Щось у вікіпедії не зовсім правильно ?? Скажіть, це не так!
davr

3
Зверніть увагу, що там написано "базовий індекс за замовчуванням", тому ця частина правильна. Однак неправильним є те, що базовий індекс за замовчуванням у BASIC все ще дорівнює 0, а не одному - тому я це виправив.
Павло Мінаєв

5
На насправді, BASIC варіювалося багато , особливо з цього питання.
RBarryYoung

9
@Yannick: Ви знаєте, що Вікіпедію можна редагувати будь-ким, так? Навіщо скаржитися на неточності; просто виправте їх!
DisgruntledGoat

3
@ ST3, це може бути, як це працює під капотом, але PHP все одно називає їх масивами, і їх основна поведінка (використання їх без вказівки ключів) діє як масиви.
Тинах

20

Фортран починається з 1. Я знаю це, тому що мій тато програмував Фортран до мого народження (мені зараз 33 роки), і він справді критикує сучасні мови програмування, починаючи з 0, кажучи, що це неприродно, а не те, як люди думають, на відміну від математики, і так далі.

Однак я вважаю речі, що починаються з 0, цілком природними; моєю першою справжньою мовою програмування був C і * (ptr + n) не працював би так гарно, якби n не починався з нуля!


12
+1: але це справді для вашого тата, який почав програмувати у Фортрані приблизно в той самий час, що і я. Я сподіваюся, що коли він навчив вас рахувати, він навчив вас чомусь на кшталт 1 корова, 2 корови, 3 корови ... Хто зараз неприродний!
High Performance Mark

6
@High Performance Mark Корова, звичайно, неприродна. Їх слід починати з 0 корів.
Абель

3
Підраховуючи елементи, навіть програмісти C не говорять, що є 0 елементів, якщо їх є 1! Але 1-й пункт все ж може бути з індексом 0.

11
Зачекайте, це означає, що на момент написання статті вам було 33 або 34?
Алек Якобсон,

8
33, це його 34-й рік
Джейсон S

14

Досить великий перелік мов є у Вікіпедії в розділі Порівняння мов програмування (масив) у таблиці "Список перехресних посилань системи масивів" (стовпчик базового індексу за замовчуванням)

Це добре обговорює показники з індексом від 1 до 0 та підписки загалом

Цитата з блогу:

EWD831 від EW Dijkstra, 1982.

Маючи справу з послідовністю довжини N, елементи якої ми хочемо розрізнити за індексом, наступним неприємним питанням є те, яке значення індексу призначити своєму початковому елементу. Дотримуючись домовленості а), починаючи з нижчого індексу 1, отримуємо діапазон індексу 1 ≤ i <N + 1; починаючи з 0, однак, отримує приємніший діапазон 0 ≤ i <N. Отже, давайте дозволимо нашим порядковим порядкам починатися з нуля: порядковий номер елемента (індекс) дорівнює кількості елементів, що передують йому в послідовності. І мораль історії полягає в тому, що ми краще розглядали - після всіх тих століть! - нуль як найбільш природне число.

Примітка :: Багато мов програмування розроблено без належної уваги до цієї деталі. У FORTRAN індекси завжди починаються з 1; в ALGOL 60 та в PASCAL була прийнята конвенція c); останній SASL відступив від конвенції FORTRAN: послідовність у SASL є одночасно функцією від додатних цілих чисел. Шкода! (Кінець зауваження.)


4
Багато інженерів, що не є спеціалістами, не погодились би (і справді) не погоджуються з деякими поглядами Дейкстри, що стосується того, що в математиці, що не є клавіатурою, 1 все ще є першим елементом масиву.
Ладья

Крім того, у fortran індекс масиву не завжди починається з 1.
Рук

11
Дійкстра, звичайно, представляє дуже упереджений погляд. Вважайте, що більшість людей описують діапазон масивів на основі 1 як "1 ≤ i ≤ N", що набагато приємніше, ніж "0 ≤ i ≤ N-1".
RBarryYoung

Так, погляд Дейкстри є дуже упередженим, і крім того, припускаючи іншу парадигму, ніж те, як люди кодують сьогодні - сьогодні аргументів проти індексації на основі 1 є набагато менше, ніж було раніше, навіть якщо саме через попередження.
Llamageddon


11

Ви можете зробити це в Perl

$[ = 1;  # set the base array index to 1

Ви також можете почати з 42, якщо вам так здається. Це також впливає на рядкові індекси.

Насправді використання цієї функції вкрай не рекомендується.


11

Також в Аді ви можете визначити свої індекси масивів відповідно до вимог:

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

7

JDBC (не мова, а API)

String x = resultSet.getString(1);  // the first column

7
+1 Це повне божевілля, це мене вражає щоразу, через те, що все інше в Java базується на нулі!
Адріан Сміт,

2
Можливо, це тому, що SQL також використовує індекси на основі 1, наприклад ORDER BY 1(перший стовпець) або SUBSTRING(name, 2)(починаючи з другого символу)
Alex Jasmin

Зверніть увагу, що Hibernate, популярний ORM для Java, який (як правило) знаходиться поверх JDBC, має методи setString, де індекс базується на 0. Заплутаний.
Тіло


5

Луа - невтішно


2
Що поганого в тому, що lua має індекс на основі 1? я робить більш зручним для початківців програмування.
RCIX,

4

Знайдено - Lua (мова програмування)

Перевірте розділ "Масиви", де сказано

"Масиви Lua базуються на 1: перший індекс дорівнює 1, а не 0, як це стосується багатьох інших мов програмування (хоча явний індекс 0 допускається)"


4

VB Classic, принаймні через

Option Base 1

База 1? Будь ласка, ні, унарний

Також VB.NET - єдина мова, де Dim x(10)створюється 11 елементів ...
Джош Лі

@jleedev: Не зовсім так - VB.NET-масиви базуються на 0базі, і число декларує верхню межу (допустимі індекси варіюються від 0до 10). Це добре , тому що VB для петель включно .
Даріо

4

Струни в Delphi починаються з 1.

(Статичні масиви повинні мати нижню межу, вказану явно. Динамічні масиви завжди починаються з 0.)



3

Ада та Паскаль.


Я не думаю, що Паскаль слід включати, оскільки він використовує і 0, і 1 залежно від того, на що дивляться. Рядки дорівнюють 1, а масиви дорівнюють 0.
Том A

1
Минув деякий час, але я вважаю, що ви можете використовувати будь-який індекс, який вам подобається, як початок / кінець масиву в Pascal, включаючи негативні значення. ARRAY [-5 ..- 2] створить масив з 4 елементів.
Dan Dyer,

3

PL / SQL . Результатом цього є те, що при використанні мов, які починаються з 0, та взаємодії з Oracle вам потрібно обробляти перетворення 0-1 самостійно для доступу до масиву за допомогою індексу. На практиці, якщо ви використовуєте таку конструкцію, як foreachнад рядками або доступ до стовпців за назвою, це не є великою проблемою, але, можливо, вам знадобиться самий лівий стовпець, який буде стовпцем 1.



3

Повна лінія мов Wirthian, включаючи Pascal, Object Pascal, Modula-2, Modula-3, Oberon, Oberon-2 та Ada (плюс кілька інших, які я, мабуть, пропустив), дозволяють індексувати масиви з будь-якої точки, яка вам подобається, включаючи, очевидно, 1.

Ерланг індексує кортежі та масиви з 1.

Я думаю, але я вже не впевнений, що Алгол і PL / 1 обидва індексують з 1. Я також впевнений, що Кобол індексує з 1.

В основному більшість мов програмування високого рівня до C індексуються з 1 (причому мови збірки є помітним винятком зі зрозумілих причин - а причина C індексується з 0) і багато мов за межами гегемонії, де домінує C, все ще роблять це донині.



2

У Visual FoxPro, FoxPro та Clipper використовуються масиви, де елемент 1 є першим елементом масиву ... Я припускаю, що це те, що ви маєте на увазі під індексом 1.


2

Я бачу, що знання фортрану тут все ще є у версії 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 є можливості обробки масивів, очевидно, що є безліч інших входів і виходів, про які тут не йдеться.


За замовчуванням VB базується на 0 (що походить від самого першого BASIC).
Павло Мінаєв

@Pavel Minaev - моя помилка. Виправлений.
Ладья




2

Базовий - не просто VB, а всі старі нумеровані версії епохи 1980-х.

Річард





0

Незважаючи на те, що 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;
}

5
Лінія , на якій потрібно відняти 1з zero_basedне визначене поведінку в відповідності з ISO C - це не законно змістити покажчик перед першим елементом в масиві. Реалізація відповідника може вставляти перевірки, що виходять за межі, які можуть бути викликані вашим кодом, наприклад.
Павло Мінаєв

Це правда. Я просто публікую це як цікаву цікавість, а не як серйозну техніку програмування. У gcc нічого поганого не відбувається, доки хтось залишається в межах вихідного масиву.
MAK
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.