Warum fangen Listen eigentlich mit 0 an?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
rayo
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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
Leonidas
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Mr. Kanister
User
Beiträge: 11
Registriert: Montag 16. Juni 2008, 16:45
Wohnort: Bedburg

Leonidas hat geschrieben:Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
Kann man es bei Visual Basic nicht auch manuell auswählen, von wo bis wo der Index gehen soll?

Gruß Martin
LINUX - May the source be with you!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mr. Kanister hat geschrieben:
Leonidas hat geschrieben:Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
Kann man es bei Visual Basic nicht auch manuell auswählen, von wo bis wo der Index gehen soll?
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

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 ;)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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. :( ;)

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.
mitsuhiko
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
lunar

Dafür ist der Indexzugriff an sich unlogischer, besonders in Sprachen, die für Listen keine Indexoperatoren kennen:

Code: Alles auswählen

List a = new ArrayList()
a.get(0)
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 ;)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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 ;)
Schon klar, ich wollte jetzt auch keine Revolution anstacheln. ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

lunar hat geschrieben:Das liest sich imho wie "hole nichts aus der Liste a" ;)
Nee, dafür hat man doch "take" ;-)
n4p
User
Beiträge: 55
Registriert: Dienstag 10. Juni 2008, 11:05

lunar hat geschrieben:Delphi gehört auch zu den Einser-Offset-Sprachen ;)
Wo hast du das denn her? Gut es ist nicht ganz durchgehend aber bei fast allen Objekten wird mit 0 angefangen.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Leonidas hat geschrieben:Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
Oh, ich dachte, es dreht sich hier nur um Programmiersprachen ;)
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Y0Gi hat geschrieben:
Leonidas hat geschrieben:Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
Oh, ich dachte, es dreht sich hier nur um Programmiersprachen ;)
Ich dachte es ginge um Python :o
lunar

n4p hat geschrieben:Wo hast du das denn her?
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:

Code: Alles auswählen

var zahlen: array[1...10] of string;
BlackJack

@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:

Code: Alles auswählen

Var Foos: Array[23..42] Of tBar;
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. :-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Verwechselt ihr da zufällig Ranges und Indizes?
BlackJack

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.
Antworten