• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czemu tablice są indeksowane od 0 ?

Object Storage Arubacloud
+1 głos
3,618 wizyt
pytanie zadane 6 stycznia 2016 w C i C++ przez Bondrusiek Maniak (61,370 p.)

Witam serdecznie,

mam pytanie odnośnie zasad działania tablic. Wielu początkujących programistów ma problem z indeksami gdyż wykorzystanie wartości z tablic zaczynamy od numeru  0 do n-1 gdzie n to ilość danych np int tab[n].

Moje pytanie brzmi : skąd ta zasada ?

      Moja pierwsza myśl to porównanie do systemu dwójkowego U2. Zakres tego kodu wynosi 2^(n-1)-1. Widząc ten zakres widzimy, że wartości wynoszą od 0 do powyższej liczby. Taki sposób kodowania tablic został najprawdopodobniej wykorzystany aby jak najefektywniej działać na pamięci RAM czy ROM, które składają się z układów a te z tranzystorów.

      Drugą myślą są zasady notacji amerykańskiej . Język C został stworzony w USA a jego 'potomek' jest język C++. Amerykanie wiele rzeczy numerują od 0 np dni tygodnia : poniedziałek jest 0 a niedziela 6 dniem tygodnia. Indeksowanie tablic mogło zostać zaczerpnięte z tej zasady i wykorzystywane dla wygody.

5 odpowiedzi

+13 głosów
odpowiedź 6 stycznia 2016 przez adrian17 Ekspert (344,860 p.)
wybrane 6 stycznia 2016 przez Bondrusiek
 
Najlepsza

Z punktu widzenia C i C++, powód jest prosty:

Dzięki temu przy operacjach na wskaźnikach A[B] może w sposób naturalny być analogiczne do *(A+B). Wskaźnik na tablicę A jest jednocześnie wskaźnikiem na pierwszy element, więc A[0] == *(A+0) == *A. Gdyby pierwszym elementem był A[1], trzeba by to było nieintuicyjnie konwertować na *(A+B-1).

A historycznie...

Język C został stworzony w USA a jego 'potomek' jest język C++.

Wiesz co, nie wszystko zaczęło się od C. Pierwszym językiem z indeksowaniem od zera (wtedy jeszcze nie było nawet idei tablic) był BCPL (stworzony w UK :P). Poza tym, że, jak pokazałem powyżej, ma to więcej sensu (co potem jeszcze dokładniej uzasadnił Dijkstra w swoim tekście "Why numbering should start at zero"), to oszczędzało to parę cykli, które w tamtych czasach były znacznie cenniejsze.

Lektura: http://exple.tive.org/blarg/2013/10/22/citation-needed/

komentarz 6 stycznia 2016 przez Bondrusiek Maniak (61,370 p.)
Dzięki za info. Faktycznie, nie wziąłem pod uwagę wskaźników, które są bardzo powiązane ze tablicami i indeksowanie tablic od zera bardzo ułatwia działanie.
+1 głos
odpowiedź 6 stycznia 2016 przez Ehlert Ekspert (212,670 p.)

W ramach ciekawostki:

W Pascalu chcąc utworzyć tablicę musisz najpierw zadeklarować jej typ. W odróżnieniu od C++ w deklaracji takiego typu musisz określić jakie wartości będzie przyjmować index. Czyli np 1..30wink

komentarz 6 stycznia 2016 przez Bondrusiek Maniak (61,370 p.)
Dzięki za odpowiedź. Nigdy nie programowałem w Pascalu więc to ciekawe co mówisz o deklaracji indeksu. Pewnie nie można tam wpisywać wartości ujemnych. Co do zera jako pierwszego elementu to na pewno jest to pozytywna cecha w mikroprocesorach, gdzie ważne jest wykorzystanie nawet najmniejszej pamięci.
0 głosów
odpowiedź 16 grudnia 2020 przez VBService Ekspert (253,380 p.)

Ja też w ramach ciekawostki:

W Visual Basic-u jest polecenie Option Base, które

Option Base
 is used to declare the default lower bound of array elements. It is declared at module level and is valid only for the current module.

By default (and thus if no Option Base is specified), the Base is 0. Which means that the first element of any array declared in the module has an index of 0.

If Option Base 1 is specified, the first array element has the index 1

–1 głos
odpowiedź 16 grudnia 2020 przez Huberto Początkujący (340 p.)
Trochę odkopię temat ale może to zainteresować innych użytkowników, a nie mogę czytać tych głupot, że Zelent powiedział, że amerykanie liczą parówki do hod-dogów od zera i dlatego tak jest...

Temat jest szeroko omówiony np. na wikipedii i typ, który to nie jako wprowadził nawet kawał pracy na ten temat napisał ale do rzeczy, podam banalny powód, który każdy  zapamięta chociaż temat jest o wiele bardziej złożony.

Jeśli nie będziemy liczyć licz jednostkowych od 0 tylko od 1 to 1-9 będzie jedynym tego typu zestawem, bo każdy inny liczymy niejako "od zera" np. 100, 101, 102, 103; 1000, 1001, 1002; 1000000, 100001, 1000002 itd. tylko pierwsza dziesiątka będzie z dupy zaczynać nie wiadomo dlaczego. Rodzi to milion innych problemów ale to trzeba sie dokopać i postudiować. Fajnie na wskaźnikach itd to chłopaki objaśnili.
–9 głosów
odpowiedź 6 stycznia 2016 przez niezalogowany
No Pan Mirosław mówił właśnie w jednym ze swoich filmików, że liczy się od zera, właśnie przez tą amerykańską konwencję. Tak sobie wymyślili i tak zostało :)
komentarz 6 stycznia 2016 przez Bondrusiek Maniak (61,370 p.)
Dzięki za szybką odpowiedź. Nie ma żadnej przyczyny technicznej ?
komentarz 6 stycznia 2016 przez Michał628496 Pasjonat (17,340 p.)
Równie dobrze możnaby było numerować od 2 :)
komentarz 6 stycznia 2016 przez Bondrusiek Maniak (61,370 p.)
Ok, dzięki za info . Myślałem, że jest to narzucone przez technologie.
komentarz 6 stycznia 2016 przez niezalogowany
Nie, to tylko taka zasada, jak to, że niedziela jest ostatnim dniem tygodnia, a nie pierwszym ;)

Podobne pytania

+1 głos
1 odpowiedź 922 wizyt
pytanie zadane 9 maja 2017 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)
0 głosów
1 odpowiedź 607 wizyt

92,579 zapytań

141,427 odpowiedzi

319,654 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...