C++, C#, C, D, Java, ... są oparte na zera.Dlaczego indeksy tablicowe są zerowe w większości języków programowania?
Matlab jest jedynym językiem, wiem, że rozpoczyna się 1.
C++, C#, C, D, Java, ... są oparte na zera.Dlaczego indeksy tablicowe są zerowe w większości języków programowania?
Matlab jest jedynym językiem, wiem, że rozpoczyna się 1.
Chyba ma głównie ze względów historycznych nowe języki po prostu starają się wykorzystać istniejącą konwencję które programiści znają.
Starsze języki, z których pochodzi ta reguła, były bliskie metalowi, a indeks jest w rzeczywistości odległością od elementu początkowego, a zatem 0
ma sens w przypadku pierwszego elementu.
Tablice są oparte na zerach w c oraz C++ jako reprezentujące przesunięcie od początku listy pozycji.
Te dwie linie mają identyczny wynik c.
anArray[3] = 4;
*(anArray +3) = 4;
Pierwszym z nich jest standardowy indeksator, drugi zajmuje wskaźnik dodaje trzy do id, a następnie wyrejestruje go. Który jest taki sam jak indeksatora.
Dodaje '3 * sizeof (int)' przy założeniu, że jest to tablica 'int'. To jest arytmetyczna wskazówka. – dramzy
Zgaduję, ponieważ tablice używają arytmetyki wskaźnikowej do odnoszenia się do pewnej wartości. Zasadniczo tablice mają ciągłą pamięć i jeśli chcesz odwołać się do 5-tego elementu (a [4]), wówczas jest wykonywany + 4 * rozmiar int
Powiedz, jeśli zaczynasz od 1, a odnosisz się do piątego elementu, będziesz musiał zrób coś takiego jak + (5-1) * rozmiar int
Prawdopodobnie "C" ma to, ponieważ jest bardziej wydajny. Aby obliczyć adres pozycji w tablicy opartej na 0, wystarczy do wielu indeksów według ItemSize, dla 1-macierzowej tablicy musisz obliczyć (Index-1) * ItemSize. "C", a następnie "C++", gdzie większość popularnych języków, więc nowe języki muszą przestrzegać tych samych zasad, pomaga uniknąć błędów dla tych, którzy używają C/C++. Ale to pytanie wydaje się być nietypowe i domyślam się, że zostanie ono zamknięte przez moderatora.
P.S. W ciągach Delphi/Pascal są one oparte na 1, ale w przypadku tablic musisz podać zasięg, abyś mógł użyć tego, co lubisz.
Weź pod uwagę słynny artykuł Dijkstry, Why numbering should start at zero. Twierdzi, że numeracja powinna rozpoczynać się od 0, ponieważ oznacza to, że poprawne indeksy w tablicy można opisać jako 0 <= i < N
. Jest to zdecydowanie bardziej atrakcyjne niż 1 <= i < N + 1
, na poziomie estetycznym.
(Można by zapytać: "dlaczego nie powiedzieć 0 < i <= N
", ale on twierdzi, że przed też ponownie ze względów estetycznych.)
Ten argument jest nieco płaski, gdy rozważymy "1 <= i <= N" - co jest jeszcze bardziej atrakcyjne na poziomie estetycznym, ponieważ teraz nawet operatory relacyjne są ze sobą zgodne. :) – cHao
@ cHao: to najgorsza opcja ze wszystkich, ponieważ oznacza, że jeśli odejmiesz dwa punkty końcowe, nie otrzymasz już długości tablicy. W rzeczywistości jest to przyczyną błędów w językach, których funkcje dzielenia macierzy są dostępne na obu końcach. –
Eh.Zazwyczaj wolę '(start, length)'. Nie tak często chcesz "elementów X do X + N-1" lub coś podobnego; chcesz "N pozycji rozpoczynających się od indeksu X". I z tym, argument długości, ale znika; prawie każdy szanujący się język w dzisiejszych czasach ma tablice, które znają ich długość. – cHao
Ponieważ istnieje 10 całkowitymi 0..9
Zobacz http://programmers.stackexchange.com/q/110804/7043 (niestety, nie można zamknąć jako duplikat - przeniesienie go do programistów .SE, a następnie zamknięcie go wydaje się głupie). – delnan
Matlab nie jest jedyny. Fortran jest dobrym przykładem indeksowania opartego na 1. Uważam, że indeksowanie oparte na 0 jest lepsze dla programowania ogólnego, a indeksowanie oparte na 1 jest bardziej naturalne dla matematyki. – German