Warum beginnen Arrays bei Index 0?
-
5.7§5 (Es geht um Pointer-Addition) "If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array, the evaluation shall not produce an overflow; otherwise, the behavior is undefined."
-
Wobei ich mir fast sicher bin dass der Teil "or one past the last element of the array" auch nur seinen Weg in den Standard gefunden hat um Iteratoren für std::vector einfach und schnell zu machen, und für Ähnliche Fälle wo man halb offene Intervalle mit Zeigern verwenden möchte.
EDIT: man könnte den Zeiger trotzdem einfach eins vor das erste Element zeigen lassen, denn in einer Sprache wo eben a[1] das erste Element bezeichnet wäre wohl der C++ Standard nicht anwendbar und daher auch kein Problem. "Technisch" im Sinne von "was kann auf den meisten Plattformen implementiert werden" ist es also sicher kein Problem. In Pascal z.B. kann ich mir überhaupt aussuchen wo ein Array losgeht, und Pascal Compiler gibts auch für genügend Plattformen.
-
hustbaer schrieb:
EDIT: man könnte den Zeiger trotzdem einfach eins vor das erste Element zeigen lassen, denn in einer Sprache wo eben a[1] das erste Element bezeichnet wäre wohl der C++ Standard nicht anwendbar und daher auch kein Problem. "Technisch" im Sinne von "was kann auf den meisten Plattformen implementiert werden" ist es also sicher kein Problem. In Pascal z.B. kann ich mir überhaupt aussuchen wo ein Array losgeht, und Pascal Compiler gibts auch für genügend Plattformen.
Stimmt, das bezieht sich dann eher darauf, in C++ Arrays, die bei 1 anfangen, effizient nachzubilden.
-
Amateur schrieb:
Hi
Welchen Grund hat es, dass Arrays bei Index 0 und nicht bei 1 beginnen? Ist das nur eine Definitionssache oder hat es andere Gründe z.B. wegen Hardware oder Optimierung oder ähnlichem?
Denn intuitiver wäre es zu sagen, das erste Element hat Index 1...Streng mathematisch betrachtet basiert unser Zahlensystem auf den Zahlen 0-9. Viele Menschen glauben aber fälschlicherweise unser Zahlensystem basiere auf 1-10, was aber schlicht falsch ist...
Die Array-Implementierung ist also mathematisch korrekt, es ist eher die menschliche Seite die zu ungenau ist...
-
skals schrieb:
Amateur schrieb:
Hi
Welchen Grund hat es, dass Arrays bei Index 0 und nicht bei 1 beginnen? Ist das nur eine Definitionssache oder hat es andere Gründe z.B. wegen Hardware oder Optimierung oder ähnlichem?
Denn intuitiver wäre es zu sagen, das erste Element hat Index 1...Streng mathematisch betrachtet basiert unser Zahlensystem auf den Zahlen 0-9. Viele Menschen glauben aber fälschlicherweise unser Zahlensystem basiere auf 1-10, was aber schlicht falsch ist...
Die Array-Implementierung ist also mathematisch korrekt, es ist eher die menschliche Seite die zu ungenau ist...
Unser Zahlensystem basiert auf der Zahl 10 (10 ist die sog. Basis), und schreiben tun wir es mit den Ziffern 0-9. Die Zahlen 0 bis 9 haben dabei keine besondere Bedeutung.
EDIT: was im übrigen nichts mit Arrays in C oder C++ zu tun hat. /EDIT
Was "mathematisch korrekt" ist ist im übrigen Definitionssache, und wenn ich eine Menge aus N Elementen definiere und diese mit E_1 bis E_10 bezeichne, dann ist das eben so. Wenn ich sie E_0 bis E_9 nenne ist es eben anders. Korrekt ist beides. Davon abgesehen dass C nichts mit Mathematik zu tun hat.
Zurück zur Frage "warum beginnen Arrays (in C und C++) mit Index 0?". C++ ist leicht zu beantworten, nämlich weil Arrays in C mit Index 0 beginnen. Und C ... ist auch nicht viel schwieriger, nämlich weil man es in Assembler auch üblicherweise so macht, also den Zeiger auf der erste Element zeigen lässt und nicht davor, und so muss der Index eben 0 sein. Zumindest bin ich davon überzeugt dass sich da niemand gross was dabei überlegt hat, sondern einfach das übernommen wurde was bei Assemblerprogrammierung gang und gebe war, und vor allem leicht in Assembler überzuführen ist.
-
In Assembler sieht man auch schön, dass Variabelnamen nur Offsets sind und letztlich für Speicheradressen stehen. Das gilt sowohl für "normale" Variabeln als auch für Arrays. Man hat im Grunde also nur Zeiger - und denen sieht man eben nicht an, ob etwas ein Array ist oder nicht. Daher ist aus technischer Sicht völlig klar, weshalb für Arrays das selbe gelten muss wie für Variabeln elementarer Typen: der Variabelnamen zeigt auf den Anfang des Speicherbereichs und nicht etwa auf ein Element davor.
Um das Problem zu veranschaulichen:void foo(int* bar) { // Ist bar ein Array von int oder nur ein Zeiger auf ein int? }
Die Behandlung von Arrays und elementaren Datentypen muss auf dieser Ebene also einheitlich sein. Und da es bei elementaren Typen ziemlich sinnlos ist vor den eigentlichen Speicherbereich zu zeigen, werden Arrays eben mit 0 beginnend indiziert.
Wie ich schon gesagt habe: dass Arrays in C bei 0 beginnen ist der geringen Abstraktion von C zu verdanken. Und dass es bei vielen Sprachen höherer Abstraktion auch so gemacht wird, ist wiederum der Gewohnheit anzulasten.
-
hustbaer schrieb:
EDIT: man könnte den Zeiger trotzdem einfach eins vor das erste Element zeigen lassen, denn in einer Sprache wo eben a[1] das erste Element bezeichnet wäre wohl der C++ Standard nicht anwendbar und daher auch kein Problem. "Technisch" im Sinne von "was kann auf den meisten Plattformen implementiert werden" ist es also sicher kein Problem. In Pascal z.B. kann ich mir überhaupt aussuchen wo ein Array losgeht, und Pascal Compiler gibts auch für genügend Plattformen.
In C, C++ geht es wohl eher um diesen "Trick":
int realarray[10]; int *array = &realarray[-1];
-
minhen schrieb:
Wie ich schon gesagt habe: dass Arrays in C bei 0 beginnen ist der geringen Abstraktion von C zu verdanken.
finde ich auch, in C ist es einfach der offset in den speicher. in höheren sprachen würde man eher ordinalzahlen (erstes, zeites, drittes, usw...) nehmen, weil in solchen sprachen maschinennahe betrachtungsweisen keine rolle spielen, auch keine adressen, pointer usw...
-
finix schrieb:
int realarray[10]; int *array = &realarray[-1];
böser trick, das gibt afaik undefiniertes verhalten!?
-
0 ist keine Zahl. Weil es sich nicht multiplizieren und addieren lässt. typisch amerikanisch.
das ist ein menschlicher denkfehler.für mich ist das 1-10. damit division durch 0 ausgeschlossen ist.
kann man C++ so manipulieren dass die Zahl 0 nicht mehr existiert? Der anfang nur 1 und die negativen zahlen -1 ohne die 0 als zwischenraum?
-
dot schrieb:
böser trick, das gibt afaik undefiniertes verhalten!?
Ja, siehe die vorigen Beiträge.
-
...
-
Bashar schrieb:
5.7§5 (Es geht um Pointer-Addition) "If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array, the evaluation shall not produce an overflow; otherwise, the behavior is undefined."
Aus welchem Gesetzbuch stammt das?
Hier geht's doch um die Grundsatzfrage, warum man ab 0 zählt und nicht ab 1. Da kannste wohl schlecht ein System als Beleg bringen, das sich für die 0 entschieden hat und darauf aufbauend dann Regeln definiert hat, die nun mit der ab 1 Zählweise nicht zusammenpassen. Ich meine, Du kannst schon, aber es zeigt einfach nichts, außer dass man wenn man sich für 0 entschieden hat man nicht einfach bei 1 anfangen kann. Wow.
-
nullhasser schrieb:
0 ist keine Zahl. Weil es sich nicht multiplizieren und addieren lässt. typisch amerikanisch.
das ist ein menschlicher denkfehler.Wie bitte? Klar ist die Null eine Zahl, mit der du ganz normal rechnen kannst (nur Division macht ein paar Probleme).
kann man C++ so manipulieren dass die Zahl 0 nicht mehr existiert? Der anfang nur 1 und die negativen zahlen -1 ohne die 0 als zwischenraum?
Sicher könnte man, aber wozu? Und was soll dann die Rechnung "7-7" für ein Ergebnis liefern?
@Jester: Wenn mich nicht alles täuscht, dürfte das aus dem ANSI C Standard kommen.
-
Die natürlichen Zahlen beginnen mit 0, da ist es natürlich auch bei Arrays so anzufangen.
Ich habe jedoch schon gehört, dass es Unis und Dozenten geben soll, die bei 1 zu zählen anfangen.
-
Ponto schrieb:
Die natürlichen Zahlen beginnen mit 0, da ist es natürlich auch bei Arrays so anzufangen.
ob die natürlichen zahlen bei 0 beginnen oder nicht ist eine streitfrage (es ist nicht allgemein definiert wo sie beginnen).
die einen machen es so, die anderen so. je nachdem was gerade praktischer ist...
in der informatik beginnt man gerne mit 0. bei uns an der uni z.b. beginnt |N in allen mathevorlesungen bei 1.
-
OK, nochmal an alle die immer wieder damit anfangen: Was hat C oder C++ mit Mathematik zu tun?
-
ich hab falsch geschrieben, ich meinte: mit der null kann man nicht multiplizieren und auch nicht dividieren. mit addition und subtraktion schon.
bei 7-7 soll -1 rauskommen und -1 steht für negativ
die bits sollen aus -1 und 1 bestehen. an aus an aus 1 -1 1 -1 so wie in steckdosen gibt es auch nur +pol und -pol. aber keine null !
-
hustbaer schrieb:
OK, nochmal an alle die immer wieder damit anfangen: Was hat C oder C++ mit Mathematik zu tun?
also dadurch dass c++ die null benützt, ist es die wahrscheinlichkeit höher dass es mal abstürzt. z.b. division durch 0. oder endlosschleifen usw...
-
nullhasser schrieb:
mit der null kann man nicht multiplizieren und auch nicht dividieren.
falls dir das noch nie untergekommen ist: man kann mit 0 multiplizieren.
und ja, 0 ist eine zahl.nullhasser schrieb:
bei 7-7 soll -1 rauskommen und -1 steht für negativ
interessante logik. wenn in einen raum 7 leute reingehen und 7 wieder rauskommen, dann ist nacher also um einen weniger drin!?
nullhasser schrieb:
so wie in steckdosen gibt es auch nur +pol und -pol. aber keine null !
ich denke du solltest dich mal etwas näher mit steckdosen befassen. dann wirst du merken, dass es dort sehr wohl 0 gibt.
nullhasser schrieb:
also dadurch dass c++ die null benützt, ist es die wahrscheinlichkeit höher dass es mal abstürzt. z.b. division durch 0. oder endlosschleifen usw...
hm. ich denke man sollte dich nicht weiter füttern :p