Czy istnieje powód, dla którego pierwszy element tablicy Zsh jest indeksowany przez 1 zamiast 0?


27

Z mojego doświadczenia z nowoczesnymi językami programowania i skryptów, uważam, że większość programistów jest przyzwyczajona do określania pierwszego elementu tablicy przez 0 jako indeksu.
Czy korzystanie z 1 ma jakieś istotne zalety ?

Jestem pewien, że słyszałem, że więcej języków innych niż Zsh zachowuje się podobnie do tablic; jest to dla mnie w porządku, ponieważ jest równie wygodne.
Jednakże, ponieważ wszystkie wcześniej wydane i szeroko używane języki skryptowe powłoki, takie jak ksh i bash, używają 0, dlaczego ktoś miałby zmienić ten wspólny „standard”?

Moja bezpośrednia odpowiedź na moje pytanie brzmiałaby „oczywiście nie”;
wtedy jedynym wyjaśnieniem, które mogę wymyślić w odniesieniu do tej „ekskluzywnej funkcji” dla powłok, byłoby „ po prostu zrobili to, aby pokazać nieco więcej swojej fajnej powłoki ”.

Nie znam jednak ani Zsh, ani jego historii i istnieje duża szansa, że ​​moja trywialna teoria na ten temat nie ma żadnego sensu.

Czy jest na to wyjaśnienie? A może to po prostu z osobistego gustu?


5
Niektóre badania historyczne (czy rantish ruminations?) Na temat 0 kontra 1: exple.tive.org/blarg/2013/10/22/citation-needed
thrig

Z przyczyn historycznych prawdopodobnie pochodzi to od cshjednego, który również wykorzystywał indeksowanie tablic w oparciu o jedną jednostkę.
cuonglm

3
obecnie sh jest standardowym językiem (nie implementacją), który ma różnych możliwych tłumaczy. Niektóre z tych interpreterów dla języka sh, takie jak bash, ksh i yash, obsługują tablice jako rozszerzenia, ale nie są częścią tego języka, podobnie jak gcc, kompilator standardowego języka C obsługuje rozszerzenia w stosunku do standardowego języka C. I podobnie jak w przypadku C, nie ma „oficjalnej” implementacji interpretera „sh”.
Stéphane Chazelas,

1
Powiązane - komentarze w tej odpowiedzi PPCG
Digital Trauma

4
Może trochę nie na temat, ale trafny. Rzymianie używali liczenia włącznie, wpatrując się w jeden zamiast zera. Następnego dnia, dla nas „dwa dni naprzód”, było dla nich „trzy dni naprzód”. Liczono dzisiaj jako jeden, a nie zero. W rezultacie, gdy ich egipscy astronomowie zalecali dzień przestępny co cztery lata, Rzymianie wprowadzali go co trzeci rok, poczynając od 45 rpne Błąd trwał do 12 lat p.n.e.
Harry Weston

Odpowiedzi:


32
  • Praktycznie wszystkie tablice powłoki (Bourne, csh, tcsh, fish, rc, es, yash) zaczynają się od 1. ksh jest jedynym wyjątkiem, jaki znam (bash właśnie skopiował ksh).
  • Większość języków tłumaczeń w czasie (na początku lat 90.): awk, tclco najmniej, i narzędzia zazwyczaj używane z powłoki ( cut -f1-3, head -n 3, sort -k1,3, cal 1 2015, comm -1) zaczynają się od 1. sed, ed, viliczba ich linie od 1 ...
  • zsh bierze to, co najlepsze z powłoki Bourne'a i csh. Macierz powłoki Bourne $@zaczyna się od 1. zsh jest zgodny z obsługą $@(jak w Bourne) lub $argv(jak w csh). Zobacz, jak to jest mylące, w kshktórym ${@:0:1}nie daje pierwszy pozycyjny parametr dla instancji.
  • Powłoka jest narzędziem użytkownika, zanim stała się językiem programowania. Dla większości użytkowników sensowne jest posiadanie pierwszego elementu $a[1]. Oznacza to również, że liczba elementów jest taka sama jak ostatni indeks (w Zsh, podobnie jak w większości innych powłok z wyjątkiem ksh, tablice nie są rzadkie).
  • a[1]dla pierwszego elementu jest zgodny z a[-1]ostatnim.

IMO powinno raczej postawić pytanie: co wpadło do głowy Davida Korna, aby jego tablice zaczynały się od zera?


7
W ludzkich językach błędem jest to, że numeracja jest oparta na jednym, i niezwykłym przypadkiem, że większość języków programowania zdołała nie dopuścić do tego, aby spuścizna ta została zaprojektowana. Smutne jest to, że po indeksowaniu od zera praktycznie uznano go za standard, tak wiele języków „zorientowanych na użytkownika” cofnęło go, próbując być „prostszym” przez ponowne użycie niewłaściwego , opartego na jednym indeksowaniu. - To powiedziawszy: najlepszym sposobem uniknięcia pomyłki w indeksowaniu jest oczywiście całkowite uniknięcie indeksów numerycznych.
leftaroundabout

Czytanie tutaj: „Gdy mamy do czynienia z sekwencją długości N, której elementy chcemy rozróżnić za pomocą indeksu dolnego, ... a) daje, zaczynając od indeksu dolnego 1, zakres indeksu dolnego 1 ≤ i <N + 1; zaczynając od 0 daje jednak lepszy zakres 0 ≤ i <N . . Nie wiem, czy TROLL, czy GŁUPIE, ale możesz użyć „1 ≤ i ≤ N” dla indeksów zaczynających się od 1 na tablicach. Nie ma potrzeby umieszczania tej +1 na końcu skanowania tablicy i żaden z punktów widzenia nie dowodzi, że indeksy początkowe z 1 lub 0 są lepsze.

1
Możesz albo usprawiedliwić, że 0 zostało dodane PO ludzkiej wiedzy i jakoś to pomieszało. theguardian.com/notesandqueries/query/0,5753,-1358,00.html - Znowu, tylko kwestia punktu widzenia :)

3
Tablica powłoki Bourne $ @ zaczyna się od 0 (nie 1) $ 0 to nazwa uruchomionego programu. powinieneś poprawić swój trzeci punkt
Edward Torvalds

2
@edwardtorvalds, Nie, $0nie jest parametrami pozycyjnymi. To nie jest częścią $@. "$@"jest "$1" "$2" .... Jeśli chodzi o funkcje, w wielu powłokach widać, że "$@"są to argumenty funkcji, a jednocześnie $0pozostaje ścieżka do skryptu (lub powłoki argv [0], gdy skrypt nie jest uruchomiony)
Stéphane Chazelas

7

Myślę, że najbardziej prawdopodobną odpowiedzią jest wbudowana odwrotna tablica zsh

Jeśli masz tablicę z 4 elementami, powiedzmy myvar=(1 2 3 4)i chcesz uzyskać dostęp do czwartego elementu print $myvar[4], prawda?

Jeśli jednak chcesz utworzyć pętlę, która będzie wyświetlać listę elementów wewnątrz tej tablicy wstecz, wystarczy użyć ujemnych indeksów:

print $myvar[-1]   # will print 4
print $myvar[-2]   # will print 3
print $myvar[-3]   # will print 2
print $myvar[-4]   # will print 1

To powinno wyjaśnić, ponieważ zaczynając od zera, nie osiągniesz jednego z tych elementów, ponieważ nie ma go -0.

Drugim powodem tego jest prawdopodobnie kod C związany ze zmiennymi na zsh używa intlub double intdefiniuje indeksy tablic, a ponieważ używa dopełnienia Two do reprezentowania liczb ujemnych, nie ma możliwości reprezentacji -0( zero z podpisem ), tak jak można to zrobić na liczbach zmiennoprzecinkowych zmienne punktowe.

Jeśli naprawdę jesteś przyzwyczajony do indeksów zaczynających się od 0, sugeruję skorzystanie z KSH_ARRAYSopcji, aby to naprawić.

I biorąc pod uwagę komentarz @cuonglm, cshfunkcje zaimplementowane zshzostały wyjaśnione tutaj . Wydaje się, że nie jest to powód historyczny, ale sposób na zapewnienie komfortowego środowiska pracy dla tych, którzy są przyzwyczajenicsh


3
Powinno to umożliwić ci dostęp do pierwszego i ostatniego elementu tablicy jednocześnie, łamiąc całą logikę skanowania tablicy;) Może nawet stworzyć czarną dziurę. LOL

3
za 0 indeksowane tablice wymienić -z ~.
mikeserv

1
@mfxx - mówiłem o bash. myślę, że obsługuje ujemne wskaźniki dla ustawionych elementów jako cukier składniowy, ale wtedy nie robi tego inaczej. nie pamiętam. z mojego punktu widzenia ludzie powinni po prostu utworzyć katalog i używać plików do wszystkiego, do czego są wpychani w ten stan powłoki. możesz indeksować te elementy w dowolny sposób.
mikeserv

1
~jest inwersją binarną. ~0jest -1. (wszystkie bity odwrócone, zależą od tego, w jaki sposób liczby ujemne są zwykle reprezentowane bitowo). W nieuzbrojonej tablicy lub tablicy z tylko jednym elementem indeksu 0, [0], [-0], [-1] i [~ 0] da ci to samo w tablicy podobnej do ksh.
Stéphane Chazelas,

1
@ StéphaneChazelas - tak, myślę, że pamiętam, jak sobie z tym poradzić, ~kiedy -indexnie działało. Chyba chyba wszystko, co zrobiłem ~-index. Tak. to brzmi dobrze. tak! i oczywiście działa to również w przypadku rozbrojonych elementów. więc przypuszczam, że powyższy komentarz powinien być - dla tablic 0-indeksowanych dodaj ~ . Chyba po prostu poradził sobie z częścią -1. nie wiem. w tej chwili nie przeskakuje mi na pierwszy plan ...
mikeserv
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.