2013-08-16 6 views
5

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.

+2

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

+0

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

Odpowiedz

0

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.

5

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.

+0

Dodaje '3 * sizeof (int)' przy założeniu, że jest to tablica 'int'. To jest arytmetyczna wskazówka. – dramzy

1

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

0

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.

2

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

+1

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

+1

@ 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. –

+0

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

0

Ponieważ istnieje 10 całkowitymi 0..9