Warum fangen Listen eigentlich mit 0 an?
Eine Frage, die mir irgendwie schon länger unter den Nägeln brennt. Welchen Grund hat es, dass man für das erste Element nicht eine 1 nimmt usw...? Beim Auslesen von Argumenten kann ich die Regelung ja noch nachvollziehen, aber bei Listen verstehe ich den Sinn dahinter nicht.
Das ist in der Informatik einfach so üblich, da man so den vollen Wertebereich einer Zahl ausnutzen kann, andernfalls fällt die 0 immer weg. Außerdem kann man so etwas einfacher adressieren, da eine Subtraktion wegfällt.
-
- User
- Beiträge: 773
- Registriert: Mittwoch 5. November 2003, 18:06
- Wohnort: Schweiz
- Kontaktdaten:
Hi
Das kommt von früher als es noch Hardwarenaher war. Da waren Arrays einfach Speicherblöcke vom selben Datentyp.
Um das erste Element anzusprechen musste man einfach die Startadresse + 0*Datentypgrösse. Für das 5. Element einfach Startadresse + 4*Datentypgrösse.
Daher ist das Zählen bei Arrays einfach bei 0 gestartet und nicht bei eins.
Gruss
Das kommt von früher als es noch Hardwarenaher war. Da waren Arrays einfach Speicherblöcke vom selben Datentyp.
Um das erste Element anzusprechen musste man einfach die Startadresse + 0*Datentypgrösse. Für das 5. Element einfach Startadresse + 4*Datentypgrösse.
Daher ist das Zählen bei Arrays einfach bei 0 gestartet und nicht bei eins.
Gruss
Beispielsweise bei Lua beginnen Listen mit der 1. Dazu gibt es eine Wiki-Seite mit interessanten Argumenten und Hintergründen für beide Zählweisen.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
In C kommt man da auch recht nahe dran, so zeigt der Pointer auf ein Array (üblicherweise) auf das erste Element, beim Offset 0 und man kann dann inkrementiren um die anderen Elemente zu bekommen.
Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 11
- Registriert: Montag 16. Juni 2008, 16:45
- Wohnort: Bedburg
Kann man es bei Visual Basic nicht auch manuell auswählen, von wo bis wo der Index gehen soll?Leonidas hat geschrieben:Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
Gruß Martin
LINUX - May the source be with you!
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
hast wohl recht, soll wohl mit Option Base verstellbar sein. Ich habe mit VB schon seit Jahren nichts mehr gemacht, weiß gar nicht mehr was das Standardverhalten war.Mr. Kanister hat geschrieben:Kann man es bei Visual Basic nicht auch manuell auswählen, von wo bis wo der Index gehen soll?Leonidas hat geschrieben:Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Delphi gehört auch zu den Einser-Offset-Sprachen
Das Offset 0 ist eine selige Erinnerung, als Software noch so einfach war, dass man Arrays über Zeiger-Arithmetik verwalten konnte
Das Offset 0 ist eine selige Erinnerung, als Software noch so einfach war, dass man Arrays über Zeiger-Arithmetik verwalten konnte
Du meinst weil man beim "Rückwärtszählen" (also beim letzten Element der Liste) die -1, -2 usw benutzt und dadurch die 0 übersprungen würde? Das klingt zwar zunächst einmal plausibel, aber in vielen anderen Lebensbereichen hingegen steht ja die 1 für das Erste und die Null für nichts. Und man fragt sich natürlich ob es bei den heutigen Kapazitäten noch so wichtig ist, diese 0 unbedingt auszunutzen. Aber das habe ich ja sowieso nicht zu entscheiden.EyDu hat geschrieben:Das ist in der Informatik einfach so üblich, da man so den vollen Wertebereich einer Zahl ausnutzen kann, andernfalls fällt die 0 immer weg.
Dass die ganze Sache historisch begründet ist, dachte ich mir schon. Ich hatte nur gehofft daß es dafür ein simple (auch für mich als relativen Anfänger verständliche) Erklärung gibt. Mit Dingen wie Pointern und Arrays bin ich ehrlich gesagt nicht wirklich bewandert.
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Außerdem sind mit einem Index von 0 die Slices logischer. ZB liste[1:-1] gibt die alles bis auf das erste Item von links und rechts.
TUFKAB – the user formerly known as blackbird
Dafür ist der Indexzugriff an sich unlogischer, besonders in Sprachen, die für Listen keine Indexoperatoren kennen:
Das liest sich imho wie "hole nichts aus der Liste a"
Letztendlich ist das aber sowas von egal, wenn der Indexzugriff das größte Problem der Informatik wäre, wären Programmierer die glücklichsten Menschen der Welt
Code: Alles auswählen
List a = new ArrayList()
a.get(0)
Letztendlich ist das aber sowas von egal, wenn der Indexzugriff das größte Problem der Informatik wäre, wären Programmierer die glücklichsten Menschen der Welt
Schon klar, ich wollte jetzt auch keine Revolution anstacheln.lunar hat geschrieben:Letztendlich ist das aber sowas von egal, wenn der Indexzugriff das größte Problem der Informatik wäre, wären Programmierer die glücklichsten Menschen der Welt
Meine Delphi-Erfahrungen sind schon ein paar Jahre her, aber soweit ich weiß, ist folgendes gültige Syntax und lässt ein Array bei 1 beginnen:n4p hat geschrieben:Wo hast du das denn her?
Code: Alles auswählen
var zahlen: array[1...10] of string;
@Lunar: Das stimmt zwar, aber deswegen würde ich Delphi nicht als Einser-Offset-Sprache bezeichnen. Man kann da nämlich mit *jedem* Index beginnen:
Damit gehört Delphi also genauso zu der seltenen Gattung der 23er-Offset-Sprachen, aber eben auch zu den Nuller-Offset-Sprachen. Es liegt in der Hand des Programmierers.
Ich hatte bei Pascal jedenfalls immer brav bei 0 angefangen, weil ich das von CBM BASIC V2 vom C64 so kannte und mir die Offsetberechnung, die in Maschinensprache dahinter steckt, bekannt war.
Code: Alles auswählen
Var Foos: Array[23..42] Of tBar;
Ich hatte bei Pascal jedenfalls immer brav bei 0 angefangen, weil ich das von CBM BASIC V2 vom C64 so kannte und mir die Offsetberechnung, die in Maschinensprache dahinter steckt, bekannt war.
Inwiefern? Man kann bei Pascal Ranges verwenden, die dann die gültigen Indizes angeben. Das erste Element in meinem Beispiel hat den Index 23. Werte kleiner als 23 werden als Bereichsverletzung aufgefasst, falls die entsprechenden Prüfungen zur Laufzeit aktiviert sind, ansonsten wird auf Elemente *vor* dem Array zugegriffen. Die Adressberechnung im Maschinencode für den Index `i` sieht so aus: ``@Foo-23+i``. ``@`` ist in Pascal der "Address-Of"-Operator.