Seite 1 von 2

Warum fangen Listen eigentlich mit 0 an?

Verfasst: Montag 16. Juni 2008, 15:07
von snafu
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.

Verfasst: Montag 16. Juni 2008, 15:37
von EyDu
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.

Verfasst: Montag 16. Juni 2008, 15:51
von rayo
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

Verfasst: Montag 16. Juni 2008, 16:11
von Y0Gi
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.

Verfasst: Montag 16. Juni 2008, 16:13
von Leonidas
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.

Verfasst: Montag 16. Juni 2008, 16:49
von Mr. Kanister
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

Verfasst: Montag 16. Juni 2008, 16:56
von Leonidas
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.

Verfasst: Montag 16. Juni 2008, 17:13
von 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 ;)

Verfasst: Montag 16. Juni 2008, 17:47
von snafu
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.

Verfasst: Montag 16. Juni 2008, 17:53
von mitsuhiko
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.

Verfasst: Montag 16. Juni 2008, 18:03
von 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 ;)

Verfasst: Montag 16. Juni 2008, 18:09
von snafu
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. ;)

Verfasst: Montag 16. Juni 2008, 18:22
von EyDu
lunar hat geschrieben:Das liest sich imho wie "hole nichts aus der Liste a" ;)
Nee, dafür hat man doch "take" ;-)

Verfasst: Dienstag 17. Juni 2008, 07:03
von n4p
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.

Verfasst: Dienstag 17. Juni 2008, 12:46
von Y0Gi
Leonidas hat geschrieben:Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
Oh, ich dachte, es dreht sich hier nur um Programmiersprachen ;)

Verfasst: Dienstag 17. Juni 2008, 14:42
von Karl
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

Verfasst: Dienstag 17. Juni 2008, 17:44
von 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;

Verfasst: Dienstag 17. Juni 2008, 23:32
von 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. :-)

Verfasst: Mittwoch 18. Juni 2008, 15:11
von Y0Gi
Verwechselt ihr da zufällig Ranges und Indizes?

Verfasst: Mittwoch 18. Juni 2008, 15:50
von 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.