Dlaczego programiści liczą od zera?
Pierwszy element listy ma numer 0. Brzmi jak złośliwość, a jest jedną z tych decyzji, które kiedyś oszczędzały pracę procesorowi, a dziś po prostu zostały z nami na dobre.
Każdy, kto zaczyna programować, przechodzi przez ten sam moment zdziwienia. Robisz listę pięciu rzeczy, chcesz wyciągnąć pierwszą i piszesz lista[1]. Dostajesz drugą. Pierwsza siedzi pod numerem zero.
To nie fanaberia, tylko adresowanie
Tablica w pamięci to po prostu ciąg komórek leżących obok siebie. Program zna adres pierwszej z nich i wielkość jednego elementu. Żeby dostać się do dowolnego, liczy tak:
adres elementu = adres_poczatku + numer * rozmiar_elementu
Przy liczeniu od zera pierwszy element to adres_poczatku + 0, czyli sam początek. Nic nie trzeba odejmować. Gdyby liczyć od jedynki, w każdym takim rachunku trzeba by dopisywać minus jeden — miliony razy na sekundę, w czasach, gdy każda instrukcja procesora była na wagę złota.
Numer to nie licznik, tylko przesunięcie
Najprościej zapamiętać to tak: numer w nawiasie nie odpowiada na pytanie „który to z kolei", tylko „o ile jesteś od początku". Pierwszy element jest o zero kroków od początku. Drugi o jeden krok. To ta sama logika, którą znasz z windy: parter nie jest pierwszym piętrem, tylko zerowym, bo jesteś zero pięter nad ziemią.
Przy okazji: dwa miłe efekty uboczne
- Zakresy nie mają dziur. Jeśli podzielisz listę stu elementów na fragmenty 0–50 i 50–100, nic się nie zgubi i nic nie zdubluje. Przy liczeniu od jedynki trzeba pilnować, czy pięćdziesiątka należy do pierwszego kawałka, czy do drugiego.
- Długość wychodzi sama. Odejmujesz koniec od początku i masz liczbę elementów. Bez plus jeden, bez minus jeden.
Są języki, które robią inaczej — Lua, R czy MATLAB liczą od jedynki, bo pisano je z myślą o matematykach, a nie o pamięci komputera. Nikt się nie myli, po prostu przyjęto inną konwencję.
Największą zaletą liczenia od zera nie jest szybkość, tylko to, że wszystkie języki poza garstką wyjątków robią to tak samo.
Jest jeszcze stary żart, który zna każdy programista: dwa najtrudniejsze problemy w informatyce to unieważnianie cache, nazywanie rzeczy i błędy o jeden. Właśnie o ten jeden chodzi.
Komentarze (6)
-
Marek
Uczę się programować od pół roku i to pierwszy tekst, po którym naprawdę zrozumiałem, o co chodzi z tym zerem. Porównanie z parterem budynku zapadło mi w pamięć.
Odpowiedz -
Marek
Uczę się programować od pół roku i to pierwszy tekst, po którym naprawdę zrozumiałem, o co chodzi z tym zerem. Porównanie z parterem budynku zapadło mi w pamięć.
Odpowiedz -
kasia_dev
Dorzucę, że w Pascalu można było ustawić dowolny początek indeksu. Brzmi wygodnie, a w praktyce robił się z tego niezły bałagan przy przenoszeniu kodu.
Odpowiedz -
kasia_dev
Dorzucę, że w Pascalu można było ustawić dowolny początek indeksu. Brzmi wygodnie, a w praktyce robił się z tego niezły bałagan przy przenoszeniu kodu.
Odpowiedz -
Tomek W.
Ten żart o błędach o jeden powinien wisieć w każdej sali szkoleniowej. Ile ja się przez to nasiedziałem nad kodem.
Odpowiedz -
Tomek W.
Ten żart o błędach o jeden powinien wisieć w każdej sali szkoleniowej. Ile ja się przez to nasiedziałem nad kodem.
Odpowiedz
Przeczytaj też
Skąd wziął się „bug”, czyli ćma w komputerze
W 1947 roku komputer wielkości pokoju zaczął się mylić. Przyczyną była ćma, która wleciała w przekaźnik. Zespół wkleił ją do dziennika i podpisał: pierwszy przypadek znalezienia prawdziwego robaka.
Dlaczego 0.1 + 0.2 nie równa się 0.3
Wpisz to działanie w konsoli przeglądarki, a zobaczysz 0.30000000000000004. To nie błąd przeglądarki ani JavaScriptu — tak liczy prawie każdy komputer na świecie.
WebSocket w Node: kiedy strona ma odzywać się sama
Zwykły HTTP działa jak wysyłanie listów: klient pyta, serwer odpowiada. Przy czacie czy powiadomieniach to za mało — potrzebna jest linia telefoniczna, którą obie strony mogą się odezwać w dowolnym momencie. Od tego jest WebSocket.
Robimy strony, które są szybkie nie tylko na papierze.
Poproś o darmową wycenę