Gibt es andere gebräuchliche "c-ähnliche" oder nicht "c-ähnliche" Sprachen mit einer Index-Array-Position ungleich Null? [geschlossen]


76

Die Programmiersprache C ist als Nullindex-Array-Sprache bekannt. Auf das erste Element in einem Array kann mit zugegriffen werden 0. Beispiel: double arr[2] = {1.5,2.5}Das erste Element im Array arrbefindet sich an Position 0. arr[0] === 1.5Welche Programmiersprachen sind 1-basierte Indizes?

Ich habe gehört, dass diese Sprachen für den Array-Zugriff bei 1 statt 0 beginnen: Algol, Matlab, Action!, Pascal, Fortran, Cobol. Ist das komplett?

Insbesondere würde ein auf 1 basierendes Array mit 1 und nicht mit Null auf das erste Element zugreifen.


8
Dies sollte ein Wiki sein
Austin Salonen

48
Warum stimmen die Leute dafür, für "keine echte Frage" zu schließen? Es ist ganz klar eine echte Frage. Es ist möglicherweise nicht das beste, das die Site jemals gesehen hat, und es ist möglicherweise sehr würdig, aber sicherlich nicht, weil es "keine echte Frage" ist.
Chris Lutz

2
Fast alles aus der Zeit vor C, da das gesamte Zero-indizierte Ding als Assmebler / C-Implementierungsartefakt begann (da echte Menschen nicht von Zero zählen). Also Basic (s), COBOL, Fortran (s) und die meisten Sprachen, die von ihnen abstammen.
RBarryYoung

1
Ich denke, der Titel ist als Frage nicht richtig formatiert, aber der Text ist es auf jeden Fall. Wie ist das keine echte Frage?
Samantha Branham

7
Chris Lutz: RE: Bitter; noch nicht wirklich bitter, sagen wir einfach "launisch und verärgert", insb. w / the Close-Voting auf dieser Seite. RE: "Food for Programming"; Sie wissen, dass ich diesen Namen als Scherz benutzt habe, aber hier ist tatsächlich ein Thema, das fast identisch mit dem ist, das seit einem Jahr offen ist: stackoverflow.com/questions/92257/programmers-food . Das ist es, was mich verärgert. Die enge Abstimmung hier hat nichts mit echten Programmierfragen zu tun und alles mit der Subkultur eines bestimmten Programmierers, die von dieser Site verhätschelt wird. Eine Subkultur, die sowohl parochial als auch aufgeschlossen ist.
RBarryYoung

Antworten:


63

Eine Liste finden Sie auf Wikipedia .

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

10
Etwas auf Wikipedia nicht ganz richtig? Sag es nicht so!
Davr

3
Beachten Sie, dass dort "Standard-Basisindex" steht, damit dieser Teil korrekt ist. Was jedoch falsch ist, ist, dass der Standardbasisindex in BASIC immer noch 0 ist, nicht einer - also habe ich das behoben.
Pavel Minaev

5
Tatsächlich variiert BASIC eine Menge , vor allem in diesem Punkt.
RBarryYoung

9
@Yannick: Du weißt, dass Wikipedia von irgendjemandem bearbeitet werden kann, oder? Warum sich über Ungenauigkeiten beschweren? korrigiere sie einfach!
DisgruntledGoat

3
@ ST3, so könnte es unter der Haube funktionieren, aber PHP nennt sie immer noch Arrays und ihr grundlegendes Verhalten (sie ohne Angabe von Schlüsseln zu verwenden) verhält sich wie Arrays.
Tynach

20

Fortran beginnt bei 1. Ich weiß das, weil mein Vater Fortran vor meiner Geburt programmiert hat (ich bin jetzt 33) und er moderne Programmiersprachen wirklich dafür kritisiert, dass sie bei 0 beginnen. Er sagt, es sei unnatürlich, nicht wie Menschen denken, im Gegensatz zu Mathematik und demnächst.

Ich finde Dinge, die bei 0 beginnen, jedoch ganz natürlich. Meine erste echte Programmiersprache war C und * (ptr + n) hätte nicht so gut funktioniert, wenn n nicht bei Null angefangen hätte!


12
+1: aber es ist wirklich für deinen Vater, der ungefähr zur gleichen Zeit wie ich mit dem Programmieren in Fortran begonnen hat. Ich gehe davon aus, dass er Ihnen, als er Ihnen das Zählen beigebracht hat, so etwas wie 1 Kuh, 2 Kühe, 3 Kühe beigebracht hat ... Nun, wer ist unnatürlich!
High Performance Mark

6
@ High Performance Mark Die Kühe sind natürlich unnatürlich. Sie sollten bei 0 Kühen beginnen.
Abel

3
Beim Zählen von Elementen sagen nicht einmal C-Programmierer, dass es 0 Elemente gibt, wenn es 1 davon gibt! Der erste Punkt kann jedoch gültig bei Index 0 sein.

11
Warten Sie, bedeutet das, dass Sie zum Zeitpunkt des Schreibens 33 oder 34 Jahre alt waren?
Alec Jacobson

8
33, das ist sein 34. Jahr
Jason S

14

Eine ziemlich große Liste von Sprachen finden Sie auf Wikipedia unter Vergleich der Programmiersprachen (Array) unter der Tabelle "Array-System-Querverweisliste" (Standard-Basisindexspalte).

Diese hat eine gute Diskussion über 1- vs. 0-indizierte und Abonnements im Allgemeinen

Um aus dem Blog zu zitieren:

EWD831 von EW Dijkstra, 1982.

Wenn es sich um eine Folge der Länge N handelt, deren Elemente wir durch einen Index unterscheiden möchten, ist die nächste ärgerliche Frage, welchen Indexwert ihrem Startelement zugewiesen werden soll. Die Einhaltung der Konvention a) ergibt, wenn mit Index 1 begonnen wird, den Indexbereich 1 ≤ i <N + 1; Beginnend mit 0 ergibt sich jedoch der schönere Bereich 0 ≤ i <N. Lassen Sie uns also unsere Ordnungszahlen bei Null beginnen: Die Ordnungszahl (Index) eines Elements entspricht der Anzahl der Elemente, die in der Sequenz davor stehen. Und die Moral der Geschichte ist, dass wir - nach all den Jahrhunderten! - Null als eine natürlichste Zahl besser betrachten sollten.

Anmerkung :: Viele Programmiersprachen wurden ohne Berücksichtigung dieses Details entwickelt. In FORTRAN beginnen Indizes immer bei 1; in ALGOL 60 und in PASCAL wurde das Übereinkommen c) angenommen; Die neuere SASL hat auf die FORTRAN-Konvention zurückgegriffen: Eine Sequenz in SASL ist gleichzeitig eine Funktion für die positiven ganzen Zahlen. Das Mitleid! (Ende der Bemerkung.)


4
Viele Nicht-CS-Ingenieure würden (und tun) einigen Ansichten von Dijkstra nicht zustimmen, da 1 in der Mathematik außerhalb der Tastatur immer noch das "Standard" -Erste Element eines Arrays ist.
Turm

Außerdem beginnt in fortran ein Array-Index nicht immer um 1.
Rook

11
Dijkstra präsentiert natürlich eine sehr voreingenommene Sichtweise zu hören. Bedenken Sie, dass die meisten Leute den Bereich der 1-basierten Arrays als "1 ≤ i ≤ N" beschreiben würden, was viel schöner ist als "0 ≤ i ≤ N-1".
RBarryYoung

Ja, Dijkstras Ansicht ist sehr voreingenommen, und außerdem gibt es heutzutage viel weniger Argumente gegen eine 1-basierte Indizierung als früher, auch wenn dies nur auf For-In zurückzuführen ist.
Llamageddon

11

Fortran, Matlab, Pascal, Algol, Smalltalk und viele andere.


4
Pascal-Arrays können bei jedem Index beginnen, nicht unbedingt bei 0 oder 1
Paul R

11

Sie können es in Perl tun

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

Sie können es auch mit 42 beginnen lassen, wenn Sie sich so fühlen. Dies wirkt sich auch auf Zeichenfolgenindizes aus.

Die Verwendung dieser Funktion wird dringend empfohlen.


11

Auch in Ada können Sie Ihre Array-Indizes nach Bedarf definieren:

A : array(-5..5) of Integer;       -- defines an array with 11 elements
B : array(-1..1, -1..1) of Float;  -- defines a 3x3 matrix

Jemand könnte argumentieren, dass benutzerdefinierte Array-Indexbereiche zu Wartungsproblemen führen. Es ist jedoch normal, Ada-Code so zu schreiben, dass er nicht von den Array-Indizes abhängt. Zu diesem Zweck stellt die Sprache Elementattribute bereit, die automatisch für alle definierten Typen definiert werden:

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 (keine Sprache, sondern eine API)

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

7
+1 Das ist totaler Wahnsinn, der mich jedes Mal erwischt, weil alles andere in Java auf Null basiert!
Adrian Smith

2
Das liegt wahrscheinlich daran, dass SQL auch 1-basierte Indizes verwendet, z. B. ORDER BY 1(erste Spalte) oder SUBSTRING(name, 2)(ab dem 2. Zeichen)
Alex Jasmin

Beachten Sie, dass Hibernate, ein beliebtes ORM für Java, das (normalerweise) über JDBC liegt, setString-Methoden hat, bei denen der Index auf 0 basiert. Verwirrend.
Thilo


5

Lua - enttäuschend


2
Was ist falsch daran, dass Lua einen 1-basierten Index hat? Ich mache es für Anfänger freundlicher zum Programmieren.
RCIX

4

Gefunden - Lua (Programmiersprache)

Überprüfen Sie den Abschnitt Arrays, in dem steht:

"Lua-Arrays basieren auf 1: Der erste Index ist 1 anstelle von 0, wie dies bei vielen anderen Programmiersprachen der Fall ist (obwohl ein expliziter Index von 0 zulässig ist)."


4

VB Classic, zumindest durch

Option Base 1

Basis 1? Bitte nicht, unary ist sooo unhandlich ...

Auch VB.NET - die einzige Sprache, in Dim x(10)der 11 Elemente erstellt werden…
Josh Lee

@jleedev: Nicht genau - VB.NET-Arrays 0basieren auf und die Zahl deklariert die Obergrenze (gültige Indizes reichen von 0bis 10). Dies passt gut, da die For-Schleifen von VB inklusive sind .
Dario

4

Saiten in Delphi beginnen bei 1.

(Bei statischen Arrays muss die Untergrenze explizit angegeben werden. Dynamische Arrays beginnen immer bei 0.)



3

Ada und Pascal.


Ich denke nicht, dass Pascal aufgenommen werden sollte, da es je nach Betrachtung sowohl 0 als auch 1 verwendet. Strings sind 1, aber Arrays sind 0.
Tom A

1
Es ist schon eine Weile her, aber ich glaube, Sie können jeden beliebigen Index als Anfang / Ende eines Arrays in Pascal verwenden, einschließlich negativer Werte. ARRAY [-5 ..- 2] würde ein Array von 4 Elementen erstellen.
Dan Dyer

3

PL / SQL . Wenn Sie Sprachen verwenden, die bei 0 beginnen und mit Oracle interagieren, müssen Sie die 0-1-Konvertierungen für den Array-Zugriff per Index selbst durchführen. In der Praxis foreachist es kein großes Problem, wenn Sie ein Konstrukt wie z. B. über Zeilen verwenden oder auf Spalten nach Namen zugreifen. Möglicherweise möchten Sie jedoch die Spalte ganz links, z. B. Spalte 1.



3

Die gesamte Wirthian-Sprachreihe, einschließlich Pascal, Object Pascal, Modula-2, Modula-3, Oberon, Oberon-2 und Ada (sowie einige andere, die ich wahrscheinlich übersehen habe), ermöglicht die Indizierung von Arrays von einem beliebigen Punkt aus, einschließlich: offensichtlich 1.

Erlang indiziert Tupel und Arrays von 1.

Ich denke - aber ich bin nicht mehr positiv -, dass Algol und PL / 1 beide von 1 indizieren. Ich bin mir auch ziemlich sicher, dass Cobol von 1 indiziert.

Grundsätzlich sind die meisten Programmiersprachen auf hoher Ebene vor C von 1 indiziert (wobei Assemblersprachen aus offensichtlichen Gründen eine bemerkenswerte Ausnahme darstellen - und der Grund, warum C von 0 indiziert), und viele Sprachen außerhalb der C-dominierten Hegemonie tun dies bis heute.



2

Visual FoxPro, FoxPro und Clipper verwenden alle Arrays, bei denen Element 1 das erste Element eines Arrays ist ... Ich gehe davon aus, dass Sie dies mit 1-indiziert meinen.


2

Ich sehe, dass das Wissen von fortran hier immer noch in der '66 -Version ist.

Fortran hat sowohl die untere als auch die obere Grenze eines Arrays variabel.

Das heißt, wenn Sie ein Array wie folgt deklarieren:

real, dimension (90) :: x

dann ist 1 die Untergrenze (standardmäßig).

Wenn Sie es wie deklarieren

real, dimension(0,89) :: x

dann hat es jedoch eine Untergrenze von 0.

Wenn Sie es andererseits wie deklarieren

real, allocatable :: x(:,:)

dann können Sie es beliebig zuordnen. Zum Beispiel

allocate(x(0:np,0:np))

bedeutet, dass das Array die Elemente enthält

x(0, 0), x(0, 1), x(0, 2 .... np)
x(1, 0), x(1, 1), ...
.
.
.
x(np, 0) ...

Es sind auch einige weitere interessante Kombinationen möglich:

real, dimension(:, :, 0:) :: d
real, dimension(9, 0:99, -99:99) :: iii

die als Hausaufgabe für den interessierten Leser übrig bleiben :)

Dies sind nur die, an die ich mich auf Anhieb erinnerte. Da eine der Hauptstärken von fortran die Array-Handhabung ist, ist es klar, dass es viele andere Ein- und Ausgänge gibt, die hier nicht erwähnt werden.


VB ist standardmäßig 0-basiert (was vom allerersten BASIC stammt).
Pavel Minaev

@ Pavel Minaev - mein Fehler. Korrigiert.
Turm




2

Basic - nicht nur VB, sondern alle nummerierten Versionen der alten 80er Jahre.

Richard





0

Obwohl C standardmäßig mit 0 indiziert ist, ist es möglich, den Zugriff auf ein Array in C so zu arrangieren, als wäre es 1 (oder ein anderer Wert) indiziert. Nicht etwas, was man von einem normalen C-Codierer oft erwarten würde, aber es hilft manchmal.

Beispiel:

#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
Die Zeile , in der Sie subtrahieren 1von zero_basedundefiniert Verhalten nach ISO C - es ist nicht legal Zeiger zu verschieben , um vor dem ersten Elemente in einem Array. Eine konforme Implementierung kann Überprüfungen außerhalb der Grenzen einfügen, die beispielsweise durch Ihren Code ausgelöst werden.
Pavel Minaev

Das stimmt. Ich poste dies nur als interessante Kuriosität und nicht als ernsthafte Programmiertechnik. In gcc passiert nichts Schlimmes, solange man innerhalb der Grenzen des ursprünglichen Arrays bleibt.
MAK
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.