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: 5440
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Montag 16. Juni 2008, 15:07

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: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 16. Juni 2008, 15:37

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:

Montag 16. Juni 2008, 15:51

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

Montag 16. Juni 2008, 16:11

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 16. Juni 2008, 16:13

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 Modvoice
Mr. Kanister
User
Beiträge: 11
Registriert: Montag 16. Juni 2008, 16:45
Wohnort: Bedburg

Montag 16. Juni 2008, 16:49

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 16. Juni 2008, 16:56

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 Modvoice
lunar

Montag 16. Juni 2008, 17:13

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: 5440
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Montag 16. Juni 2008, 17:47

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:

Montag 16. Juni 2008, 17:53

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

Montag 16. Juni 2008, 18:03

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: 5440
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Montag 16. Juni 2008, 18:09

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: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 16. Juni 2008, 18:22

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

Dienstag 17. Juni 2008, 07:03

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

Dienstag 17. Juni 2008, 12:46

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